【问题标题】:How to replace only the item at the top of a fragment back stack with another fragment?如何仅用另一个片段替换片段返回堆栈顶部的项目?
【发布时间】:2015-07-06 15:43:25
【问题描述】:

当我执行getSupportFragmentManager().popBackStack(); 时,它会弹出回栈并执行与弹出回栈条目关联的片段事务。

我有 3 个片段:
- 片段A
- 片段B
- 片段C

我的活动在用户推广时执行 3 次交易:

  1. 首先将片段 A 添加到我的容器中。
  2. 然后分离 FragmentA 并添加 FragmentB。并且交易被添加到后台堆栈。
  3. 然后我想要 FragmentC 仅替换 fragmentB 并更改返回堆栈条目,以便当用户按下返回按钮时,FragmentA 应该显示出来。

这是我执行事务 3 的代码:

FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
fm.popBackStack();
ft.remove(fragmentB)
    .add(R.id.container, fragmentC, tag)
    .addToBackStack(null)
    .commit();

事务 1 和 2 似乎运行良好。但是,当我尝试执行事务 3 时,发生的情况是 FragmentB 被 FragmentC 替换,但在 FragmentC 被绘制之前,Fragment A 也出现了,并且 FragmentA 继续出现在 FragmentC 后面。

我做错了什么?如何在后台不显示 FragmentA 的情况下将 FragmentB 替换为 FragmentC。

【问题讨论】:

  • popBackStack()pops/removes 最后一个fragment 添加到queue 并且不执行任何进一步的操作。你真正想达到什么目标?
  • @hrskrs 你是对的!只是这似乎正在发生。我已将问题更改为包含代码 sn-p 和描述性工作。

标签: android android-fragments fragment-backstack fragmentmanager


【解决方案1】:

如果不是解决方案,我找到了解决方法。

似乎在事务 3 中,当我删除 FragmentB 时,先前分离的 FragmentA 会自动添加。这就是导致 FragmentA 显示在 FragmentC 后面的原因。

解决方法是在移除 FragmentA 后再次分离 FragmentA,如下所示:

ft.remove(fragmentB)
    .detach(fragmentA) // Detach FragmentA that is automatically added by the removing of fragmentB
    .add(R.id.container, fragmentC, tag)
    .addToBackStack(null)
    .commit();

【讨论】:

  • 使用此解决方案,当您按下返回按钮时,fragmentA 是否会显示?
  • 没有。但是,在 FragmentC 出现之前,会出现一个空白屏幕。但我想这不是一个相关的问题,可以按照here 所示修复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-18
  • 2019-07-11
相关资源
最近更新 更多