2013-08-19 60 views
15

我已經使用了來自http://developer.android.com/training/implementing-navigation/nav-drawer.html的指導原則使用DrawerLayout進行了一個活動。相互之間顯示的片段

當我點擊一個drawerItem,我替換爲新片段當前視圖:

Fragment fragment; 
Bundle args = new Bundle();  
fragment = new NewsListFragment(); 
args.putInt("category", position); 

// Insert the fragment by replacing any existing fragment 
FragmentManager fragmentManager = getSupportFragmentManager(); 
fragmentManager.beginTransaction() 
        .replace(R.id.content_frame, fragment) 
        .commit();   
mDrawerList.setItemChecked(position, true); 

現在,有時舊片段不會被替換,但新的片段被放置在舊的頂部:

http://img15.imageshack.us/img15/3179/1kqj.png

這是爲什麼,以及如何解決這個問題?

相關的XML:

<!-- The main content view --> 
<LinearLayout 
    android:id="@+id/rlMain" 
    android:layout_width="fill_parent" 
    android:orientation="vertical" 
    android:layout_height="fill_parent"> 

    <FrameLayout 
     android:id="@+id/content_frame" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_weight="1"> 
    </FrameLayout> 

這隻發生有時,我還沒有找到一個流動重現這個呢。該應用程序不支持旋轉,所以它不會發生在那裏。

+0

片段片段; Bundle args = new Bundle(); fragment = new NewsListFragment(); args.putInt(「category」,position); //通過替換任何現有片段來插入片段 FragmentManager fragmentManager = getSupportFragmentManager(); fragmentManager。的BeginTransaction() .replace(R.id.content_frame,片段) \t \t \t \t .addToBackStack(空) .commit(); mDrawerList.setItemChecked(position,true); –

+0

你能否貼上你的xml? –

+6

嘗試使用'container.removeAllViews();'在'onCreateView'方法請 –

回答

19

我們去住這個版本還沒有收到這方面有任何的抱怨,所以我會假設這是正確的答案:

onCreateView添加方法:

if (container != null) { 
    container.removeAllViews(); 
} 

一定要檢查容器是否爲空!

謝謝https://stackoverflow.com/users/2677588/lia-pronina

+1

請務必測試您的後退按鈕行爲,因爲它可能會引用backStack上的舊片段。如果是這樣,使用'getActivity()。getFragmentManager()。popBackStack()' –

0

,讓我們嘗試用

fragmentManager.beginTransaction().executePendingTransactions(); 

後調用commit()方法

0

添加在每個佈局

android:background="#FFFFFF" 

佈局背景默認是transparen,所以只是把背景顏色和新的內容片斷,不顯示在舊片段

9

約1周後,我找到了解決方案,無需添加背景色或其他任何東西。只需添加此代碼並修復廢話。我希望它能幫助你們所有人。

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    container.clearDisappearingChildren(); 
    return inflater.inflate(R.layout.fragment, container, false); 
} 
0

我跑在這個相同的問題,我看到已經有一個接受的答案,但這些答案不是100%正確,並沒有解決我的問題。 @Niels提出的答案刪除了視圖,但片段仍然被添加。 這是我在用的:

/** 
* Call this to remove all the other added fragments and keep only the current one. 
* 
* @param activity the activity to which the fragment has been attached. 
* @param fragment the fragment we want to keep. 
*/ 
public static void removeOtherAddedFragments(@NonNull AppCompatActivity activity, @NonNull Fragment fragment) { 
    FragmentManager fragmentManager = activity.getSupportFragmentManager(); 
    for (Fragment frag : fragmentManager.getFragments()) { 
     if (frag != null && !frag.equals(fragment) && frag.isAdded()) { 
      fragmentManager.beginTransaction().remove(frag).commit(); 
     } 
    } 
} 

我打電話這在我的onResume,以確保它也將被稱爲當我瀏覽回片段。

+0

當你在另一個頂部顯示新的片段時,你不能只調用fragmentTransaction.replace()而不是add()。 –

+0

我這樣做,但問題是在後面的導航。如果您有: 1/add A 2 /替換B(並且不要保留在背後) 3 /替換C(並保留在背後) 4 /返回,您可能會遇到問題。 這是一個來自android的錯誤:替換是「刪除/隱藏和添加」而不是「刪除和添加」,一旦添加新的,另一個將留在它後面... –