如何只用另一个片段替换片段返回堆栈顶部的项目?

How to replace only the item at the top of a fragment back stack with another fragment?

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

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

我的 activity 在用户推荐时执行了 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 取代,但 FragmentA 也在 FragmentC 被绘制到它上面之前出现,并且 FragmentA 继续出现在 FragmentC 后面。

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

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

似乎在事务 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();