在 FragmentManager 中管理 BackStackEntries

Posted

技术标签:

【中文标题】在 FragmentManager 中管理 BackStackEntries【英文标题】:Manage BackStackEntries in FragmentManager 【发布时间】:2011-07-15 13:39:42 【问题描述】:

如何清除FragmentManager中的BackStackEntries?这是我用来更改片段对象的代码:

FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
Fragment homeFragment = new Home();
fragmentTransaction.replace(R.id.mainFragement, homeFragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();

在特定情况下,我需要删除完整的 backstack 条目。我在片段管理器中没有找到任何特定的方法。你有什么想法吗?

【问题讨论】:

【参考方案1】:

我一直在研究一种我认为可以满足您要求的方法,但是我从文档中唯一能弄清楚的是这种方法是否只是清空 BackStack 或者是否有任何对 View 容器的影响。基本上,它找到位于堆栈顶部的条目并删除所有内容,包括该条目。如果其他人认为有负面影响,请告诉我,因为我会很好奇:

public static void clearBackStack(FragmentManager manager)
    int rootFragment = manager.getBackStackEntryAt(0).getId();
    manager.popBackStack(rootFragment, FragmentManager.POP_BACK_STACK_INCLUSIVE);

【讨论】:

还有一个捷径:manager.popBackstack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE)【参考方案2】:

这对我来说很好用:

clearFragments(FragmentManager fm) 
    while (fm.popBackStackImmediate());

【讨论】:

【参考方案3】:

你是对的,就我可以阅读文档而言,没有办法清除堆栈。

这是一个大问题。尝试将问题上传到 android 的 issue tracker,我希望有人能看到它。我还在等mine。

这是一个很好的技巧,但您可以尝试完成您的 Activity 并重新开始。它可能会清除堆栈。

【讨论】:

谢谢 Macarse。我已经上传了issue 我无法完成我的活动。许多用户操作正在那里进行。如果我完成它,一切都会停止。谢谢【参考方案4】:

如果你想清除所有的后台堆栈可能是因为你要做的事情与之前的上下文无关。在这种情况下,您应该启动一个新的活动。

正如我开始理解的那样,对于 Fragments,Activity 将作为 Fragments 的容器工作。您应该尝试保持 Fragment 之间的独立性,同时根据它们的上下文在活动中组织它们。

在您的情况下,当特定情况发生时,您可以启动一个新的 Activity 并将所需的片段放在这个新的 Activity 上,而不是放在旧的 Activity 中。这个新的 Activity 将处理新的 Fragment 堆栈。这样你的代码也会更加封装,不是吗?

看看这个解释性回复:CommonsWare reply

希望对你有帮助!

【讨论】:

【参考方案5】:

您是否尝试过在片段管理器中调用 popBackStack() ?

【讨论】:

以上是关于在 FragmentManager 中管理 BackStackEntries的主要内容,如果未能解决你的问题,请参考以下文章

Android中FragmentManager进行片段回收的目的是啥?

关于FragmentManager动态管理Fragment时Fragment生命周期的探究

如何避免 FragmentManager 重新创建片段?

AsyncTask 和 FragmentManager 的问题

Android11.5 创建和管理Fragments

在 FragmentManager 中更改片段