【问题标题】:How to destroy Fragment?如何销毁碎片?
【发布时间】:2011-08-19 08:56:46
【问题描述】:

我有一个ActivityActivity 有两个 Fragments。 片段 A 是菜单。片段 B 是细节。

我尝试在片段 B 中制作其他片段 C,因此,Activity 中有 3 个片段。 我尝试将片段 B 替换为片段 D。

我猜片段 B 和 C 已经死了。 但是这些碎片还活着。只是片段是onDestroyView() 状态。我想要onDestroy()onDetach()

我为Fragments.onDestroy()onDetach() 做什么?我无法销毁或更改Activity

【问题讨论】:

  • 您是否通过添加到后台堆栈来替换?如果是这样,那么我不希望片段被破坏。如果您是,则不要在替换时将事务添加到后台堆栈。

标签: android android-fragments


【解决方案1】:

如果您不手动删除这些片段,它们仍会附加到活动中。您的活动没有被破坏,所以这些片段也是如此。 要删除(销毁)这些碎片,您可以调用:

fragmentTransaction.remove(yourfragment).commit()

希望对你有帮助

【讨论】:

  • 这帮助我解决了可怕的“重复 ID”崩溃问题。谢谢!
  • 当一个fragment被移除时,调用哪个fragment生命周期方法?同样,当一个片段被替换时,片段生命周期的哪个方法被调用?
  • 哇,这使得 Google 的 replace() 文档完全错误:This is essentially the same as calling remove(Fragment) for all currently added fragments that were added with the same containerViewId and then add(int, Fragment, String) with the same arguments given here. 实际上,仅调用 remove() 会破坏片段,而 replace 不会。
  • 我无法以这种方式杀死我的片段。这应该在哪里准确调用?
【解决方案2】:

试试这个

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

【讨论】:

  • 哪个 Fragment 类有要覆盖的 destroyItem 方法?
  • 你可以在 FragmentPagerAdapter 类中找到这个,但我不认为这个问题是针对视图寻呼机提出的
【解决方案3】:

如果你在片段本身,你需要调用它。您的片段需要是被调用的片段。输入代码:

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

或者如果你使用supportLib,那么你需要调用:

getSupportFragmentManager().beginTransaction().remove(yourFragment).commitAllowingStateLoss();

【讨论】:

  • 不建议使用 commitAllowingStateLoss() 方法,这会给您带来很多痛苦,除非您确定可以接受丢失数据。
  • 是的,那是肯定的。最好使用提交!仍然取决于上下文
【解决方案4】:

如果您在片段中,请使用它。

@Override
        public void onDestroy() {
            super.onDestroy();

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

        }

【讨论】:

    【解决方案5】:

    在 kotlin 中,我们可以在 Fragment 的任何位置执行此操作

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

    【讨论】:

      【解决方案6】:

      Kotlin

      中使用
      appCompatActivity?.getSupportFragmentManager()?.popBackStack()
      

      【讨论】:

      • 这是弹出最新添加的片段。这可能会弹出隐藏的 Fragment,例如 GlideFragmentManager,或 UI 中的其他 Fragment,因此在没有至少一个 TAG 的情况下弹出是一种不好的做法,并且会在您的应用程序的某些时候导致问题。
      猜你喜欢
      • 1970-01-01
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 2022-08-03
      • 1970-01-01
      • 2013-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多