gpt4 book ai didi

android - 如何清除支持FragmentManager的backStack?

转载 作者:太空宇宙 更新时间:2023-11-03 11:07:30 25 4
gpt4 key购买 nike

有什么办法,如何在不调用存储 fragment 中的 onCreateView() 的情况下清除支持 FragmentManager 的 backStack?

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

我也知道如何从后台弹出所有 fragment

mFragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

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

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

但是有没有什么办法,如何通过仅从 onDestroyView() 而不是从 onCreateView() ( fragment 内部)调用来清除这个后台堆栈?

或者有什么方法可以通过清除以前的 fragment 来替换事务?

比如我想在做交易之前先弄清背景:

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

最佳答案

我还没有找到解决这个问题的简单方法。我几乎可以肯定 FragmentManagerFragment 没有任何功能允许您控制从堆栈中弹出 fragment 时调用哪个生命周期方法。我将概述两种可能的方法。每个都有一些不受欢迎的方面。

第一种方法假定您从后台弹出的 fragment 是 Activity 的子项。如果它们是 fragment 的子对象,该方法仍然适用,只是父对象的类型不同。

使用 getter 方法将 bool 成员 mClearingBackStack 添加到 Activity (或父 fragment )。当您开始完全清除后台堆栈时, 设置 bool 值。在要禁用处理的 fragment 生命周期方法中,获取标志并相应地修改处理。对于 onCreateView()onDestroyView(), fragment 将被附加并且宿主 Activity 可用 getActivity()。使用标志的 getter 方法将其转换为您的 Activity 类。

因为 popBackStack() 是异步的,清除标志必须在堆栈展开完成后才能完成。我没试过,但我想在调用 popBackStack() 后发布一个 Runnable清除标志应该有效。因为 Runnable 需要排在队列的末尾,View.post()必须使用而不是 Activity.runOnUiThread() .另一种方法是调用 executePendingTransactions()等待堆栈展开完成。

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

关于android - 如何清除支持FragmentManager的backStack?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31361090/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com