清除回退栈并用顶层片段替换当前片段

5
我在我的Android应用程序中有一个活动,处理多个视图/片段的替换。该活动还具有导航抽屉,可导航到顶级片段。从顶级片段,您可以导航到详细级别的片段。
可以通过从左侧滑动来始终访问导航抽屉。如果当前片段是顶级片段,则也可以通过操作栏访问导航抽屉。如果当前片段是详细级别的片段,则可以通过操作栏(或按下返回按钮)导航回去。
假设我有3个可以通过导航抽屉访问的顶级片段。
fragment[1]fragment[2]fragment[3]fragment[1],您可以导航到详细级别的fragment[1.1]
现在用户想要直接从当前的fragment[1.1]导航到顶级fragment[3]。用户只需滑动导航抽屉并单击fragment[3]项即可。
现在,如果用户按下返回按钮,则应用程序应关闭(因为它导航到了顶级片段)。因此,每次用户导航到顶级片段时,后退堆栈都应该被清除。为了检查是否应该显示抽屉指示器,我正在读取getBackStackEntryCount()值并将其与0进行比较。
总之,我想从详细级别的片段导航到任何顶级片段并清除后退堆栈。
问题是:
当我通过执行getSupportFragmentManager().popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);来清除后退堆栈时,片段事务会以相反的方式重播(例如,fragment[1]fragment[1.1]替换)。而我不希望它们重播。我在onCreateView,onViewCreated,onStart中有很多初始化等,还要开始任务来获取数据。我想跳过所有这些。只需用尚未在后退堆栈中的新顶级视图替换详细级别视图即可。
我找不到清除后退堆栈而不弹出事务的解决方案。
有没有干净的解决此问题的方法?我必须实现自己的后退堆栈行为吗?
编辑: YouTube应用程序也是这样运作的。当您从详细信息导航到顶级时,后退堆栈会被清除。但是他们如何清除后退堆栈而不重播片段事务?
感谢您的答案。
1个回答

1
我认为你的问题是在循环中弹出了片段。通常,我会将片段与自定义动画一起推入片段堆栈中 - 比如从右侧滑入新片段,弹出时向右侧滑出。现在,如果用户已经导航到1.1,然后是1.2等等,当用户在操作栏中单击主页按钮时,你希望导航回1,就需要为片段1交易指定一个名称,然后在执行弹出时使用该名称。此外,还考虑使用popBackStack函数而不是popBackStackImmediate。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接