Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/225.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何清除支持碎片管理器的后台?_Android_Android Fragments_Back Stack_Fragmenttransaction_Fragment Backstack - Fatal编程技术网

Android 如何清除支持碎片管理器的后台?

Android 如何清除支持碎片管理器的后台?,android,android-fragments,back-stack,fragmenttransaction,fragment-backstack,Android,Android Fragments,Back Stack,Fragmenttransaction,Fragment Backstack,有没有办法,如何在不调用存储片段中的onCreateView()的情况下清除SupportFragmentManager的backbackback 我理解片段lyfe循环,并在弹出时调用onDestroyView()和onCreateView()。 我还知道如何用 mFragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 或 我还没有找到解决这个问题的简单方法。我几乎可以肯定,Fragment

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

我理解片段lyfe循环,并在弹出时调用onDestroyView()和onCreateView()。

我还知道如何用

mFragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);


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

第一种方法假设从后台弹出的片段是活动的子级。如果它们是片段的子对象,则该方法仍然适用,只是另一种类型的父对象

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

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


第二种方法是更干净的,如果您的设计能够适应它的话。创建一个占位符片段,该片段是活动的子级,也是所有其他片段的父级。对于您现在拥有的所有片段事务,使用新片段的
FragmentManager
,使用获得。当您希望清除所有这些事务时,不要弹出子片段管理器的堆栈,而是在活动的片段管理器中删除或替换父片段。当父片段被移除时,它的所有子片段都将被销毁,并执行拆卸步骤、onDestroyView()、onDestroy()等,但如果其backback被展开,则不会执行所有步骤。这种方法比第一种方法简单得多,也更易于维护,但需要重新编写片段层次结构。这种方法的另一个问题是,必须添加一些代码来处理带有片段层次结构的Back操作。描述了问题和各种解决方案。

您的目标是避免在片段视图从堆栈中弹出时重新创建片段视图,因为您知道弹出完成后,最终片段状态将被“销毁”?是的,这正是我想要的。有可能,您能解决这个问题吗?我现在在做单活动体系结构时也遇到了同样的问题。@EdwinMartinez不是真的。我所做的(我并不为此感到骄傲),通过活动中的“cleaningBackstack”属性进行了丑陋的变通。所以活动中的代码如下所示:``cleaningBackstack=true;fragmentManager.popBackStack(null,fragmentManager.POP_BACK_堆栈,包括在内);fragmentManager.executePendingTransactions();cleaningBackstack=false;`在片段中创建的onview中:```if(a.isCleaningBackstack())return```
for(int i = 0; i < mFragmentManager.getBackStackEntryCount(); ++i) {            
     mFragmentManager.popBackStack();
}
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
fragmentManager.beginTransaction().replace(R.id.content, fragment).commit();