2

我正在創建一個應用程序,其中我使用偏好片段與導航抽屜我的問題是我創建導航抽屜和其中我添加了一些菜單項,我想要當應用程序加載時,加載首選項Fragment作爲第一個元素。它不會顯示。當我改變選項,即當我改變抽屜菜單選項像第二個元素在抽屜菜單拳頭視圖不替換第二個,它是重疊的第一個enter image description here如何避免片段與Android導航抽屜重疊

我的導航抽屜xml是遵循

<android.support.v4.widget.DrawerLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/drawer_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.koteswara.wise.NavigationDrawerMainActivity" > 

    <FrameLayout 
     android:id="@+id/container" 

     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 
<LinearLayout 
     android:id="@+id/drawer" 
     android:layout_width="240dp" 
     android:layout_height="match_parent" 
     android:orientation="vertical" 
     android:layout_gravity="start" > 
<ListView 
    android:id="@+id/drawer_list" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@android:color/white" 
    android:choiceMode="singleChoice" 
    android:divider="@android:color/transparent" 
    android:dividerHeight="0dp" 
    tools:context="com.koteswara.wise.NavigationDrawerFragment" /> 
</LinearLayout> 

</android.support.v4.widget.DrawerLayout> 

我的偏好片段就像是被添加加載PreferenceFragment這

public class AutoAnswerPreferenceActivity extends PreferenceFragment implements OnSharedPreferenceChangeListener { 
    private AutoAnswerNotifier mNotifier; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.preference); 
     mNotifier = new AutoAnswerNotifier(getActivity()); 
     mNotifier.updateNotification(); 
     SharedPreferences sharedPreferences = getPreferenceManager().getSharedPreferences(); 
     sharedPreferences.registerOnSharedPreferenceChangeListener(this); 


     } 

    @Override 
    public void onDestroy() { 
     getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); 
     super.onDestroy(); 
     } 
    @Override 
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { 
     if (key.equals("enabled")) { 
      mNotifier.updateNotification(); 
      } 
     } 

    } 

我的片段類是

public class AutoAnswarFragment extends Fragment { 

    @Override 
    public void onCreate(@Nullable Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     getActivity().getFragmentManager().beginTransaction().replace(R.id.container, new AutoAnswerPreferenceActivity()) .commit(); 


    } 

在顯示出片段的方法是

protected void showFragment(int position) { 
     // TODO Auto-generated method stub 
     Fragment fragment = null; 

     switch (position) { 
     case 0: 
      fragment = new AutoAnswarFragment(); 
      break; 
     case 1: 
      fragment = new Tab2(); 
      break; 
     case 2: 
      // fragment = new BhajanaFragment(); 
      break; 
     } 
     if (fragment != null) { 
      FragmentManager fragmentManager = getSupportFragmentManager(); 
      fragmentManager.beginTransaction() 
        .replace(R.id.container, fragment).commit(); 

      // update selected item and title, then close the drawer 
      // mDrawerList.setItemChecked(position, true); 
      // mDrawerList.setSelection(position); 
      mTitle = mDrawer_title[position]; 
      // mDrawerLayout.closeDrawer(mDrawerList); 
     } else { 
      // error in creating fragment 
      // Log.e("MainActivity", "Error in creating fragment"); 
     } 
    } 


} 

如果我會打電話比偏好碎片像下方之外的片段導航抽屜類將作品請幫我

public class Tab1 extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     View v =inflater.inflate(R.layout.tab_1,container,false); 
     return v; 
    } 
} 

我是努力澄清解決方案,請它任何機構解決它,並請告訴我的解決方案。我將感謝滿請幫助我

+0

即時消息也爲此尋找一個完美的答案,但還沒有得到。但我已經做了一個小竅門,我只是把白色的背景顏色給我的佈局。問題解決了。 –

+0

我在xml中使用框架佈局是我需要使框架佈局的背景爲白色 –

+0

是的。我這樣做,並暫時解決它。但實際上它不是正確的方式。 –

回答

0

就這麼人y天的研究和在網上搜索我已經找到了一個解決方案,它的工作正常我爲上述問題有一個鏈接在網絡上作爲http://www.michenux.net/android-preferencefragmentcompat-906.html在這個我找到了一個示例apk和一個關於apk的源代碼。因爲這個apk有解決我的問題的功能。我清除了導入時將出現的源代碼錯誤,之後我將該庫添加到了我的項目中。我使用PreferenceCompatFragment而不是PreferenceFragmentCompat,它解決了我的問題,如果有人需要幫助,也可以幫助他們,以便我發佈我的解決方案,以解決上述問題。並且我感謝誰幫助我誰,並且爲上述問題提供了一些有價值的建議。 下面的類下面我用PreferenceFragmentCompat代替V7支持庫的

public abstract class PreferenceCompatFragment extends Fragment { 

    private static final int FIRST_REQUEST_CODE = 100; 
    private static final int MSG_BIND_PREFERENCES = 1; 
    private static final String PREFERENCES_TAG = "android:preferences"; 
    private boolean mHavePrefs; 
    private boolean mInitDone; 
    private ListView mList; 
    private PreferenceManager mPreferenceManager; 

    private Handler mHandler = new Handler() { 
     @Override 
     public void handleMessage(Message msg) { 
      switch (msg.what) { 

       case MSG_BIND_PREFERENCES: 
        bindPreferences(); 
        break; 
      } 
     } 
    }; 

    final private Runnable mRequestFocus = new Runnable() { 
     public void run() { 
      mList.focusableViewAvailable(mList); 
     } 
    }; 

    private void bindPreferences() { 
     PreferenceScreen localPreferenceScreen = getPreferenceScreen(); 
     if (localPreferenceScreen != null) { 
      ListView localListView = getListView(); 
      localPreferenceScreen.bind(localListView); 
     } 
    } 

    private void ensureList() { 
     if (mList == null) { 
      View view = getView(); 
      if (view == null) { 
       throw new IllegalStateException("Content view not yet created"); 
      } 

      View listView = view.findViewById(android.R.id.list); 
      if (!(listView instanceof ListView)) { 
       throw new RuntimeException("Content has view with id attribute 'android.R.id.list' that is not a ListView class"); 
      } 

      mList = (ListView)listView; 
      if (mList == null) { 
       throw new RuntimeException("Your content must have a ListView whose id attribute is 'android.R.id.list'"); 
      } 

      mHandler.post(mRequestFocus); 
     } 
    } 

    private void postBindPreferences() { 
     if (mHandler.hasMessages(MSG_BIND_PREFERENCES)) { 
      mHandler.obtainMessage(MSG_BIND_PREFERENCES).sendToTarget(); 
     } 
    } 

    private void requirePreferenceManager() { 
     if (this.mPreferenceManager == null) { 
      throw new RuntimeException("This should be called after super.onCreate."); 
     } 
    } 

    public void addPreferencesFromIntent(Intent intent) { 
     requirePreferenceManager(); 
     PreferenceScreen screen = inflateFromIntent(intent, getPreferenceScreen()); 
     setPreferenceScreen(screen); 
    } 

    public void addPreferencesFromResource(int resId) { 
     requirePreferenceManager(); 
     PreferenceScreen screen = inflateFromResource(getActivity(), resId, getPreferenceScreen()); 
     setPreferenceScreen(screen); 
    } 

    public Preference findPreference(CharSequence key) { 
     if (mPreferenceManager == null) { 
      return null; 
     } 
     return mPreferenceManager.findPreference(key); 
    } 

    public ListView getListView() { 
     ensureList(); 
     return mList; 
    } 

    public PreferenceManager getPreferenceManager() { 
     return mPreferenceManager; 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     getListView().setScrollBarStyle(0); 
     if (mHavePrefs) { 
      bindPreferences(); 
     } 
     mInitDone = true; 
     if (savedInstanceState != null) { 
      Bundle localBundle = savedInstanceState.getBundle(PREFERENCES_TAG); 
      if (localBundle != null) { 
       PreferenceScreen screen = getPreferenceScreen(); 
       if (screen != null) { 
        screen.restoreHierarchyState(localBundle); 
       } 
      } 
     } 
    } 

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     dispatchActivityResult(requestCode, resultCode, data); 
    } 

    @Override 
    public void onCreate(Bundle paramBundle) { 
     super.onCreate(paramBundle); 
     mPreferenceManager = createPreferenceManager(); 
    } 

    @Override 
    public View onCreateView(LayoutInflater paramLayoutInflater, ViewGroup paramViewGroup, Bundle paramBundle) { 
     return paramLayoutInflater.inflate(R.layout.preference_list_content, paramViewGroup, false); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     dispatchActivityDestroy(); 
    } 

    @Override 
    public void onDestroyView() { 
     mList = null; 
     mHandler.removeCallbacks(mRequestFocus); 
     mHandler.removeMessages(MSG_BIND_PREFERENCES); 
     super.onDestroyView(); 
    } 

    @Override 
    public void onSaveInstanceState(Bundle bundle) { 
     super.onSaveInstanceState(bundle); 
     PreferenceScreen screen = getPreferenceScreen(); 
     if (screen != null) { 
      Bundle localBundle = new Bundle(); 
      screen.saveHierarchyState(localBundle); 
      bundle.putBundle(PREFERENCES_TAG, localBundle); 
     } 
    } 

    @Override 
    public void onStop() { 
     super.onStop(); 
     dispatchActivityStop(); 
    } 

    /** Access methods with visibility private **/ 

    private PreferenceManager createPreferenceManager() { 
     try { 
      Constructor<PreferenceManager> c = PreferenceManager.class.getDeclaredConstructor(Activity.class, int.class); 
      c.setAccessible(true); 
      return c.newInstance(this.getActivity(), FIRST_REQUEST_CODE); 
     } catch (Exception e) { 
      throw new RuntimeException(e); 
     } 
    } 

    private PreferenceScreen getPreferenceScreen() { 
     try { 
      Method m = PreferenceManager.class.getDeclaredMethod("getPreferenceScreen"); 
      m.setAccessible(true); 
      return (PreferenceScreen) m.invoke(mPreferenceManager); 
     } catch (Exception e) { 
      throw new RuntimeException(e); 
     } 
    } 

    private void setPreferenceScreen(PreferenceScreen preferenceScreen) { 
     try { 
      Method m = PreferenceManager.class.getDeclaredMethod("setPreferences", PreferenceScreen.class); 
      m.setAccessible(true); 
      boolean result = (Boolean) m.invoke(mPreferenceManager, preferenceScreen); 
      if (result && preferenceScreen != null) { 
       mHavePrefs = true; 
       if (mInitDone) { 
        postBindPreferences(); 
       } 
      } 
     } catch (Exception e) { 
      throw new RuntimeException(e); 
     } 
    } 

    private void dispatchActivityResult(int requestCode, int resultCode, Intent data) { 
     try { 
      Method m = PreferenceManager.class.getDeclaredMethod("dispatchActivityResult", int.class, int.class, Intent.class); 
      m.setAccessible(true); 
      m.invoke(mPreferenceManager, requestCode, resultCode, data); 
     } catch (Exception e) { 
      throw new RuntimeException(e); 
     } 
    } 

    private void dispatchActivityDestroy() { 
     try { 
      Method m = PreferenceManager.class.getDeclaredMethod("dispatchActivityDestroy"); 
      m.setAccessible(true); 
      m.invoke(mPreferenceManager); 
     } catch (Exception e) { 
      throw new RuntimeException(e); 
     } 
    } 

    private void dispatchActivityStop() { 
     try { 
      Method m = PreferenceManager.class.getDeclaredMethod("dispatchActivityStop"); 
      m.setAccessible(true); 
      m.invoke(mPreferenceManager); 
     } catch (Exception e) { 
      throw new RuntimeException(e); 
     } 
    } 


    private void setFragment(PreferenceFragment preferenceFragment) { 
     try { 
      Method m = PreferenceManager.class.getDeclaredMethod("setFragment", PreferenceFragment.class); 
      m.setAccessible(true); 
      m.invoke(mPreferenceManager, preferenceFragment); 
     } catch (Exception e) { 
      throw new RuntimeException(e); 
     } 
    } 

    public PreferenceScreen inflateFromResource(Context context, int resId, PreferenceScreen rootPreferences) { 
     PreferenceScreen preferenceScreen ; 
     try { 
      Method m = PreferenceManager.class.getDeclaredMethod("inflateFromResource", Context.class, int.class, PreferenceScreen.class); 
      m.setAccessible(true); 
      preferenceScreen = (PreferenceScreen) m.invoke(mPreferenceManager, context, resId, rootPreferences); 
     } catch (Exception e) { 
      throw new RuntimeException(e); 
     } 
     return preferenceScreen; 
    } 

    public PreferenceScreen inflateFromIntent(Intent queryIntent, PreferenceScreen rootPreferences) { 
     PreferenceScreen preferenceScreen ; 
     try { 
      Method m = PreferenceManager.class.getDeclaredMethod("inflateFromIntent", Intent.class, PreferenceScreen.class); 
      m.setAccessible(true); 
      preferenceScreen = (PreferenceScreen) m.invoke(mPreferenceManager, queryIntent, rootPreferences); 
     } catch (Exception e) { 
      throw new RuntimeException(e); 
     } 
     return preferenceScreen; 
    } 
} 
0

確保所有片段的根佈局具有

的android:背景=「@顏色/ your_favorite_color」

這樣他們會隱藏下面的其他片段。