Android 如何销毁碎片?

Android 如何销毁碎片?,android,android-fragments,Android,Android Fragments,我有一个活动。活动有两个片段s。 片段A是菜单。片段B是细节 我尝试在片段B中生成其他片段C,因此,活动中有3个片段。 我试着把片段B替换成片段D 我猜碎片B和C已经死了。 但这些碎片是活的。只有片段是onDestroyView()state。我想要ondestory()或onDetach() 对于Fragments.onDestroy()或onDetach(),我该怎么做?我无法销毁或更改活动如果您不手动删除这些片段,它们仍然连接到活动。您的活动未被销毁,因此这些片段也会被销毁。 要删除(销毁

我有一个
活动
活动
有两个
片段
s。 片段A是菜单。片段B是细节

我尝试在片段B中生成其他片段C,因此,
活动中有3个片段。
我试着把片段B替换成片段D

我猜碎片B和C已经死了。 但这些碎片是活的。只有片段是
onDestroyView()
state。我想要
ondestory()
onDetach()


对于
Fragments.onDestroy()
onDetach()
,我该怎么做?我无法销毁或更改
活动

如果您不手动删除这些片段,它们仍然连接到活动。您的活动未被销毁,因此这些片段也会被销毁。 要删除(销毁)这些碎片,可以调用:

fragmentTransaction.remove(yourfragment).commit()
希望对您有所帮助

尝试一下

@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);
}

如果你在片段本身,你需要调用这个。您的片段必须是正在调用的片段。输入代码:

getFragmentManager().beginTransaction().remove(yourFragment).commitAllowingStateLoss();
或者,如果您正在使用
supportLib
,则需要调用:

getSupportFragmentManager().beginTransaction().remove(yourFragment).commitAllowingStateLoss();
它在Kotlin中使用

如果你在片段中,就用这个


在科特林,我们可以在片段的任何地方这样做

 activity?.run {
     supportFragmentManager.beginTransaction().remove(this@MyFragment)
        .commitAllowingStateLoss()  
   }

是否通过添加到后堆栈来替换?如果是这样的话,我不希望碎片被销毁。如果是,则不要在替换时将事务添加到后堆栈。这帮助我解决了可怕的“重复id”崩溃。谢谢当一个片段被移除时,调用哪个片段生命周期方法?类似地,当一个片段被替换时,会调用片段生命周期中的哪个方法?哇,这使得Google的replace()文档完全错误:
这本质上与调用remove(fragment)来移除当前添加的所有片段是一样的,这些片段是使用相同的containerWebID添加的,然后再添加(int,fragment,String)与这里给出的参数相同。
实际上,仅调用remove()会破坏片段,而replace不会。我无法用这种方式杀死片段。具体应该在哪里调用它?哪个片段类具有要重写的destroyItem方法?您可以在FragmentPagerAdapter类中找到它,但我不认为该问题是针对视图页面提出的。我们不建议使用commitAllowingStateLoss()方法,这将给您带来很多痛苦,除非您确定自己可以丢失数据。是的,那是肯定的。最好使用commit!仍然取决于上下文这是弹出最新添加的片段。这可能会弹出一个隐藏的片段,比如GlideFragmentManager,或者UI中的另一个片段,因此在没有标记的情况下弹出是一种不好的做法,并且会在应用程序的某个点上导致问题。
@Override
        public void onDestroy() {
            super.onDestroy();

            getFragmentManager().beginTransaction().remove((Fragment) youfragmentname).commitAllowingStateLoss();

        }
 activity?.run {
     supportFragmentManager.beginTransaction().remove(this@MyFragment)
        .commitAllowingStateLoss()  
   }