2016-01-27 143 views
2

如果我有一個片段加載,片段A,和替換片段B中片段,加入片段A到返回堆棧像這樣:調用popBackStack()後,當前片段會發生什麼?

public void replaceFragment(Fragment frag, String fragTag) { 
    mFragmentTransaction = mFragmentManager.beginTransaction(); 
    mFragmentTransaction.replace(R.id.fragmentContainer, frag, fragTag); 
    mFragmentTransaction.addToBackStack(null); 
    mFragmentTransaction.commit(); 
} 

,然後從片段BI呼叫:

popBackStackImmediate(); 

因此片段A再次被加載。片段B會發生什麼?在我的代碼中,我創建了一個新的Fragment B對象,並使用我的replaceFragment()方法加載它,並重復該過程。每當我用B替換A並調用popBackStack()或在調用popBackStack時B被銷燬時,我是否創建了一堆片段B?謝謝。

回答

3

popBackStack()反轉您的上次交易,在您的情況下,replace交易。

FragmentTransaction文檔非常清楚。什麼替換:

替換已添加到容器的現有片段。這是 基本上與爲所有當前所有 調用remove(Fragment)相同的containerViewId添加片段,然後使用此處給定的相同參數add(int,Fragment,String)添加片段相同。

所以,如果加入,你打電話replace(container, B),你實際上是調用

  • remove(A)
  • add(B)

中說,與popBackStack()扭轉這種交易本質上是做:

  • remove(B)
  • add(A)

,你問,這取決於你如何使用你的方法,A或B的實例。據我所知,一個remove d片段將被銷燬(除非你保留對它的引用)。如果每次調用new Fragment(),答案都很簡單 - 您正在創建大量實例。

FragmentTransaction API提供了另一種方法來處理像您這樣的情況,您必須在其中切換AB多次。這些都是有據可查的。例如,您可以使用hide()show()來隱藏片段A並顯示片段B,而不收集垃圾並創建不必要的新實例。

另外,您可以使用detach()attach()。與show和hide的區別在於,這種方式片段視圖(注意:不是片段實例)每次都會被銷燬並重新創建。另一方面,隱藏並顯示視圖,而不會破壞視圖。

相關問題