2011-08-19 91 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()