替换后退栈中的顶部片段

14

我在处理安卓碎片时遇到了很多麻烦...假设我的后退栈看起来像这样

[C]
[B]
[A]
---

按下返回按钮会弹出Fragment C,并将Fragment B留在堆栈顶部。现在,我如何在保持后退栈的同时将Fragment C替换为Fragment D?注意,在操作期间无法看到Fragment B

[C] <- [D]               [D]
[B]            ----->    [B]
[A]                      [A]
---                      ---

这样做,按下“返回”按钮会将Fragment D弹出,留下Fragment B在顶部。Fragment C完全从堆栈中移除。

我将每个片段都像这样添加到堆栈中。

FragmentTransaction ft = manager.beginTransaction();
ft.replace(id, instance, getTag(instance));
ft.addToBackStack(getTag(instance));
ft.commit();

我以为这可以通过不使用addToBackStack进行相同的调用来实现,但它只会使Fragment DFragment B重叠。


我认为这可以通过不使用addToBackStack进行相同的调用来实现,但这将导致Fragment DFragment B重叠。

如果没有使用addToBackStack,即使从栈中弹出了该事务,该事务仍然存在,导致您的D片段与B片段同时可见。 - njzk2
3个回答

4

您是否在添加D片段之前尝试弹出后退堆栈:

FragmentManager fragmentManager = getFragmentManager();
fragmentManager.popBackStack(); // or popBackStackImmediate();
ft.addToBackStack(<fragmentD>);

1
抱歉,我忘了在操作期间无法看到“片段B”。不过,感谢您的建议 :) - ains
1
有点能用,但是返回栈被通知了,B片段会短暂地显示出来。不是很理想。 - njzk2

0

fragmentTransaction.replace 应该替换 FragmentManager 中的所有片段,然后添加新的片段。 根据 Google

这基本上相当于调用对使用相同 containerViewId 添加的所有当前已添加片段调用 remove(Fragment),然后再使用此处给出的相同参数调用 add(int, Fragment, String)。

但正如我们所看到的,并不总是有效。

(关于此问题的其他有用问题:FragmentTransaction replace not working)

我使用以下代码(借助 fragmentManager.getFragments()):

int top = getSupportFragmentManager().getFragments().size()-1;
while (top > 0 && getSupportFragmentManager().getFragments().get(top) == null) {
    top--;
}
getSupportFragmentManager().beginTransaction()
                 .remove(getSupportFragmentManager().getFragments().get(top))
                 .add(R.id.fragment_container, newfrag).commit();

我知道我没有使用返回栈,但是我对它有点困惑。


0

很长一段时间过去了。 我遇到了同样的问题。我的解决方案。

    val topFragment = supportFragmentManager.findFragmentByTag(TAG)
    val transaction = supportFragmentManager.beginTransaction()
    if (topFragment != null) {
            val removeTransaction = supportFragmentManager.beginTransaction()
            supportFragmentManager.popBackStack()
            removeTransaction.remove(currentFragment).commitAllowingStateLoss()
    }
    transaction.add(containerId, newFragment, newFragmentTag)
    transaction.addToBackStack(newFragmentTag)
    transaction.commit()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接