4

有什麼辦法,如何清除backStack的支持FragmentManager沒有調用存儲片段中的onCreateView()?如何清除支持FragmentManager的backStack?

我明白片段lyfe循環,並在彈出時調用onDestroyView()和onCreateView()。 http://developer.android.com/guide/components/fragments.html#Creating

而且我知道如何流行從堆棧中的所有片段,片段

mFragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 

for(int i = 0; i < mFragmentManager.getBackStackEntryCount(); ++i) {    
    mFragmentManager.popBackStack(); 
} 

,但兩種方式都呼籲onCreateView()等LYFE週期方法直到onDestroyView()和onDestroy()。

但有沒有什麼辦法,如何明確這個只從onDestroyView()調用而不是從onCreateView()(在片段內)的後臺堆棧?

或者有什麼辦法如何做清除以前的片段替換交易?

例如,我想清楚backstact我做交易前:

FragmentManager fragmentManager = getSupportFragmentManager(); 
fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
fragmentManager.beginTransaction().replace(R.id.content, fragment).commit(); 
+0

您的目標是避免重新創建片段視圖,因爲它們彈出堆棧,因爲您知道當彈出完成時,最終片段狀態將被「銷燬」? –

+0

是的,這是我想要的 – Kikju

回答

0

我還沒有找到一個簡單的解決這個問題。我幾乎可以肯定,沒有FragmentManagerFragment的功能,允許您控制從堆棧彈出片段時調用哪個生命週期方法。我將概述兩種可能的方法。每個都有一些不受歡迎的方面。

第一種方法假定您從疊堆彈出的碎片是活動的子項。如果他們是一個片段的子元素,該方法仍然適用,只是一個不同類型的父對象。

使用getter方法將布爾成員mClearingBackStack添加到活動(或父級片段)。設置布爾型只有當你開始完全清除後臺堆棧。在要禁用處理的碎片生命週期方法中,獲取標誌並相應地修改處理。對於onCreateView()onDestroyView(),片段將被附加並且主機活動可用於getActivity()。將其轉換爲任何您的活動類使用標誌的getter方法。

由於popBackStack()是異步的,只有在堆棧解除完成後才能清除標誌。我還沒有嘗試過,但我認爲在撥打popBackStack()以清除標誌後應發佈Runnable。由於Runnable需要在隊列末尾,因此必須使用View.post()而不是Activity.runOnUiThread()。另一種方法是致電executePendingTransactions()等待堆棧解除完成。

第二種方法更清潔,如果您的設計可以適應它。創建一個作爲您的活動的孩子的佔位符片段,併爲您的所有其他片段創建一個父代片段。對於您現在所有的片段交易,請使用使用getChildFragmentManager()獲得的新片段FragmentManager。如果要清除所有這些事務,而不是彈出子片段管理器的堆棧,請移除或替換活動的片段管理器中的父片段。當父代片段被移除時,其所有孩子都會被銷燬並通過拆解步驟,onDestroyView(),onDestroy()等。但是而不是所有的步驟,如果它的後背被解開將會發生。這種方法比第一種方法更簡單,更易於維護,但需要重新修改片段層次結構。此方法的另一個問題是您必須添加一些代碼來處理具有片段層次結構的Back操作。這個問題和各種解決方案描述如下here