如何只用另一个片段替换片段返回堆栈顶部的项目?
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 笔交易:
- 首先将片段 A 添加到我的容器中。
- 然后分离FragmentA并添加FragmentB。并将事务添加到返回堆栈。
- 那么我想要的是 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();
当我执行 getSupportFragmentManager().popBackStack();
时,它会弹出返回堆栈并执行与弹出的返回堆栈条目关联的片段事务。
我有 3 个片段:
- 片段A
- 片段 B
- 片段 C
我的 activity 在用户推荐时执行了 3 笔交易:
- 首先将片段 A 添加到我的容器中。
- 然后分离FragmentA并添加FragmentB。并将事务添加到返回堆栈。
- 那么我想要的是 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();