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

时间:2015-07-06 15:43:26

标签: android android-fragments fragment-backstack fragmentmanager

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

我有3个片段:
  - FragmentA
  - 片段B
  - FragmentC

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

  1. 首先将片段A添加到我的容器中。
  2. 然后分离FragmentA并添加FragmentB。并且事务被添加到后台堆栈。
  3. 然后我想要的是FragmentC只替换fragmentB并更改后面的堆栈条目,这样当用户按下后退按钮时,FragmentA应该显示出来。
  4. 这是执行事务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取代,但片段A也会在FragmentC被覆盖之前显示,FragmentA继续在FragmentC后面看到。

    我做错了什么?如何在没有FragmentA背景显示的情况下用FragmentC替换FragmentB。

1 个答案:

答案 0 :(得分:0)

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

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