Android 如何仅用另一个片段替换片段后堆栈顶部的项?

Android 如何仅用另一个片段替换片段后堆栈顶部的项?,android,android-fragments,fragment-backstack,fragmentmanager,Android,Android Fragments,Fragment Backstack,Fragmentmanager,当我执行getSupportFragmentManager().popbackbackstack()时它弹出后堆栈并执行与弹出的后堆栈条目相关联的片段事务 我有3个片段: -碎片a -碎片b -碎片 “我的活动”在用户升级时执行3个事务: 片段A首先添加到我的容器中 然后分离碎片A并添加碎片B。事务被添加到后堆栈中 然后我想要的是FragmentC只替换fragmentB并更改back stack条目,这样当用户按下back按钮时,FragmentA就会出现 以下是我执行事务3的代码: Frag

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

我有3个片段:
-碎片a
-碎片b
-碎片

“我的活动”在用户升级时执行3个事务:

  • 片段A首先添加到我的容器中
  • 然后分离碎片A并添加碎片B。事务被添加到后堆栈中
  • 然后我想要的是FragmentC只替换fragmentB并更改back stack条目,这样当用户按下back按钮时,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在它上面画出之前,FragmentA也出现了,FragmentA继续出现在FragmentC后面


    我做错了什么?如何用FragmentC替换FragmentB,而不让FragmentA出现在背景中。

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

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

    我找到了一个解决办法,如果不是解决办法的话

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

    popBackStack()
    pops/删除添加到
    队列上的最后一个
    片段
    ,不执行任何进一步的操作。你到底想实现什么?@hrskrs你说得对!只是这似乎正在发生。我已将问题更改为包含代码片段和描述性工作。
    popBackStack()
    pops/removes
    添加到
    队列上的最后一个
    片段
    ,并且不执行任何进一步的操作。你到底想实现什么?@hrskrs你说得对!只是这似乎正在发生。我已将我的问题更改为包含代码片段和描述性工作。使用此解决方案,当您按下后退按钮时,
    fragmentA
    是否会显示?否。但是,在FragmentC显示之前,一个空白屏幕会闪烁。但我认为这不是一个相关的问题,可以如图所示进行修复。使用此解决方案,当您按下后退按钮时,
    fragmentA
    是否会显示?否。但是,在FragmentC显示之前,一个空白屏幕会闪烁。但我认为这不是一个相关的问题,可以如图所示进行修复。