当前位置: 首页 > 知识库问答 >
问题:

如何清除支持碎片管理器的备份?

谢阳成
2023-03-14

有没有办法,在不调用存储片段中的onCreateView()的情况下清除support FragmentManager的backbackback?

我理解片段lyfe循环,并在弹出时调用onDestroyView()和onCreateView()。http://developer.android.com/guide/components/fragments.html#Creating

我还知道如何用

mFragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

for(int i = 0; i < mFragmentManager.getBackStackEntryCount(); ++i) {            
     mFragmentManager.popBackStack();
}

但这两种方法都是调用onCreateView()和其他lyfe循环方法,直到调用onDestRoyView()和onDestroy()。

但是有没有办法,如何通过仅从onDestRoyView()调用而不是从onCreateView()(在片段内部)调用来清除这个背包?

或者有没有办法用清除以前的碎片来代替交易?

例如,我希望在进行交易之前进行明确的反推:

FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
fragmentManager.beginTransaction().replace(R.id.content, fragment).commit();

共有1个答案

景永望
2023-03-14

我还没有找到解决这个问题的简单方法。我几乎可以肯定,碎片管理器(FragmentManager)或碎片管理器(FragmentManager)没有任何功能允许您控制从堆栈中弹出碎片时调用哪个生命周期方法。我将概述两种可能的方法。每个都有一些不可取的方面。

第一种方法假设从backback中弹出的片段是活动的子项。如果它们是片段的子对象,则该方法仍然适用,只是不同类型的父对象。

使用getter方法将布尔成员mClearingBackStack添加到活动(或父片段)。仅当开始完全清除回撤时,才设置布尔值。在要禁用处理的片段生命周期方法中,获取标志并相应地修改处理。对于通过onDestroyView()的onCreateView(),片段将被附加,宿主活动可通过getActivity()获得。使用flag的getter方法将其强制转换为活动类的任何对象。

由于popBackStack()是异步的,因此只有在堆栈展开完成后才能清除标志。我没有试过,但我认为在调用popBackStack()清除标志后发布一个Runnable应该可以。由于Runnable需要放在队列的末尾,请查看。必须使用post()而不是Activity。runOnUiThread()。另一种方法是调用executePendingTransactions(),等待堆栈展开完成。

第二种方法更简洁,如果您的设计可以容纳它。创建一个占位符片段,它是您的活动的子片段,也是您所有其他片段的父片段。对于您现在拥有的所有片段事务,使用新片段的FragmentManager,使用getChildFragmentManager()获得。当您想清除所有这些事务时,不要弹出子片段管理器的堆栈,而是在活动的片段管理器中删除或替换父片段。当父片段被删除时,它的所有子片段都将被销毁,并经历拆除步骤,onDestRoyView()、onDestroy()等,但不是如果其后端堆栈被展开会发生的所有步骤。这种方法比第一种方法简单得多,也更容易维护,但是需要您重新设计片段层次结构。这种方法的另一个问题是,您必须添加一些代码来处理片段层次结构的Back操作。这里描述了问题和各种解决方案。

 类似资料:
  • 我正在使用 Kotlin 进行开发。当我到达官方Android教程的片段部分时,我遇到了支持FragmentManager。它可以在Kotlin中用作变量,而在java中,我们可以将其等效方法称为。 我想知道变量在哪里,因为我看不到任何类似于该名称的变量声明,但是单击该变量将我带到fragmentActivity中的以下方法。java类。 在Kotlin中,这个方法如何可以作为变量访问,而在jav

  • 问题内容: 我今天只是在学习片段。我按下一个按钮,它添加/删除了一个片段。但是,如果我尝试删除该片段,那么除了要删除的片段之外,每个片段都会被删除,为什么?第一次按正确添加一个片段。 我在xml中有两个这样的片段:当我单击按钮时,我希望添加未在xml中定义的片段,而确实是。但是,下次我按下按钮时,应该删除该片段。除该片段外,所有内容均被删除。 问题答案: 您无法删除使用XML添加的。如果要通过该方

  • 一、简介 碎片是什么?把一个完整的页面理解成由许多块组成,而每一个“块”我们就可认为就是一个”碎片“! 这样,我们在页面放置一些碎片,在以后的维护维护中,只需要对碎片进行维护! 碎片功能支持完全手动更新,并且可以搜索内容,可恢复数据至任何历史版本,常用于专题制作和首页频繁更新的内容。 您可以在模板中直接插入 {pc:block pos="index_block_1"}{/pc} 格式的碎片标签,然

  • 我想要的正确行为是: 我目前的工作: 当我想从B回到A时,我使用了,但在这里一切都很顺利 我真的需要与管理器中包含的片段相同。 有人知道我做错了什么吗? 我的代码: 我已经搜索了一段时间没有结果的解决方案,所以请不要将此标记为重复。 提前感谢。

  • 这听起来可能很基本,但在中,我应该清理什么?如果片段正在被销毁,是否应该为我自动清理引用(如上下文)?

  • 我有一个用于交换片段的框架布局。我使用导航抽屉,每个菜单项都会打开一个片段。所以可以肯定的是,在所有应用程序周期中,屏幕上同时只有一个片段(因此只有一个活动)。下面您可以找到我的片段开始方法 所以当我在androidstudio上检查时,每次我用上述方法替换fragment时,内存使用量都会增加<代码>碎片事务。删除不会释放碎片,而替换也不会释放碎片。所以,过了一段时间,如果我点击每一个菜单项,一