2011-08-19 137 views
37

我有一個ActivityActivity有兩個Fragment s。 片段A是菜單。片段B是細節。如何破壞碎片?

我嘗試在片段B中製作其他片段C,因此,在Activity中有3片段。 而我嘗試將片段B替換爲片段D.

我想片段B和C已經死了。 但這些碎片還活着。只是片段是onDestroyView()狀態。我需要onDestroy()onDetach()

我該怎麼辦Fragments.onDestroy()onDetach()?我無法銷燬或更改Activity

+0

你更換使用通過向後退堆棧?如果是這樣的話,我不希望碎片被破壞。如果你是那麼不把交易添加到替換上的後退堆棧。 – PJL

回答

54

如果您不手動刪除這些碎片,它們仍會附加到該活動。你的活動不會被破壞,所以這些碎片也是如此。 要刪除(這樣破壞)這些片段,您可以撥打:

fragmentTransaction.remove(yourfragment).commit() 

希望它可以幫助你

+0

這幫助我了可怕的「重複ID」崩潰。謝謝! – xorgate

+0

當一個片段被刪除時,哪個片段生命週期方法被調用?同樣,當一個片段被替換爲片段生命週期的哪個方法被調用? –

+4

哇,這使得Google的文檔中的replace()完全錯誤:「這與爲所有當前添加的片段調用remove(Fragment)相同的containerViewId然後添加(int,Fragment,String)這裏給出了相同的參數。「實際上,只有調用remove()會破壞片段,而替換不會。 – 0101100101

9

給一個嘗試這種

@Override 
public void destroyItem(ViewGroup container, int position, Object object) { 
    // TODO Auto-generated method stub 

    FragmentManager manager = ((Fragment) object).getFragmentManager(); 
    FragmentTransaction trans = manager.beginTransaction(); 
    trans.remove((Fragment) object); 
    trans.commit(); 

    super.destroyItem(container, position, object); 
} 
2

如果你在片段本身,你需要調用它。 yourFragment需要被調用的片段。輸入代碼:

getFragmentManager()。beginTransaction()。remove(yourFragment).commitAllowingStateLoss();

,或者如果你正在使用supportLib,那麼你需要調用:。

getSupportFragmentManager()調用BeginTransaction()刪除(yourFragment).commitAllowingStateLoss();

-1

它在科特林

appCompatActivity?.getSupportFragmentManager()?.popBackStack()