【问题标题】:Clear backstack and replace current fragment with a top-level fragment清除 backstack 并用顶级片段替换当前片段
【发布时间】:2014-04-28 12:50:58
【问题描述】:

我的 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、.. 中有很多初始化,还启动了获取数据的任务。我想跳过这一切。只需将详细级别视图替换为尚未在后台堆栈中的新顶级视图即可。

我找不到任何解决方案来清除后台堆栈而不弹出事务。
有没有一个干净的解决方案来处理这个问题?我必须实现自己的 backstack-behavior 吗?

编辑: YouTube 应用程序的行为也是如此。当您从详细信息导航到顶层时,后台堆栈将被清除。但是他们如何在不重放片段事务的情况下清除后台堆栈呢?

感谢您的回答。

【问题讨论】:

    标签: android transactions fragment back-stack


    【解决方案1】:

    我认为你的问题是你在循环中弹出片段 - 我猜。我通常将片段推送到片段堆栈上,同时指定自定义动画 - 比如说从右侧滑入新片段,然后在弹出它时向右滑出。现在 - 如果您的用户已导航到片段 1,然后是 1.1,然后是 1.2 等,并且您想在用户单击操作栏中的主页按钮时导航回 1 - 为您的片段 1 事务指定名称。您执行弹出使用该名称。还可以考虑使用 popBackStack 函数而不是 popBackStackImmediate。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-18
      • 1970-01-01
      相关资源
      最近更新 更多