2011-03-15 24 views
4

如何FragmentManager
這清除BackStackEntries是我用它來改變我的片段對象疥BackStackEntries在FragmentManager

FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); 
Fragment homeFragment = new Home(); 
fragmentTransaction.replace(R.id.mainFragement, homeFragment); 
fragmentTransaction.addToBackStack(null); 
fragmentTransaction.commit(); 

在特定的情況下,我需要取出完整的堆棧中的條目的代碼。
我在片段管理器中沒有找到任何特定的方法。

任何想法?

回答

6

我一直在研究一種方法,我認爲是做你要做的事情,但我從文檔中唯一能夠弄清楚的是這種方法是否清空BackStack或者是否存在視圖容器上的任何含義。基本上,它會找到位於堆棧頂部的條目並刪除所有內容,包括該條目。如果其他人認爲有負面影響,讓我知道,因爲我很好奇:

public static void clearBackStack(FragmentManager manager){ 
    int rootFragment = manager.getBackStackEntryAt(0).getId(); 
    manager.popBackStack(rootFragment, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
} 
+0

是的,這將工作。謝謝。 –

+4

還有一個快捷方式: 'manager.popBackstack(null,FragmentManager.POP_BACK_STACK_INCLUSIVE)' – zilinx

0

您是否在Fragment manager中嘗試popBackStack()調用?

+0

不工作。 popBackStack不用於清除堆棧。 –

2

你說得對,就我能讀的文檔來說,沒有辦法清理堆棧。

這是一個大問題。嘗試上傳問題到Android的issue tracker,我希望有人看着它。我仍在等待mine

這是一個非常黑客,但你可以嘗試完成你的Activity並重新開始。它可能會清除堆棧。

+0

謝謝Macarse。我已經上傳了[問題](http://code.google.com/p/android/issues/detail?id=15591&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars) –

+0

我無法完成我的活動。很多用戶操作正在執行。如果我完成了它,一切都會停止。謝謝 –

1

如果你想清除所有後退堆棧,可能是因爲你要做的事情與前一個上下文無關。在這種情況下,你應該啓動一個新的活動。

正如我開始明白,與片段,活動將作爲碎片的容器。您應該嘗試在片段之間保持獨立性,並根據其上下文在「活動」中組織它們。

對於你的情況,當特定的情況發生時,你可以啓動一個新的Activity並將所需的片段放置在這個新的Activity上,而不是放置在舊的Activity中。這個新的Activity將處理新的碎片堆棧。這樣你也會讓你的代碼更加封裝,不是嗎?

看看這個解釋答覆:CommonsWare reply

希望它能幫助!

1

這對我工作得很好:

clearFragments(FragmentManager fm) { 
    while (fm.popBackStackImmediate()); 
}