14

我在使用 Android 片段时遇到了很多麻烦......假设我的后台堆栈看起来像这样

[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重叠。

4

3 回答 3

4

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

FragmentManager fragmentManager = getFragmentManager();
fragmentManager.popBackStack(); // or popBackStackImmediate();
ft.addToBackStack(<fragmentD>);
于 2013-07-06T03:10:02.590 回答
0

应该替换FragmentManager中的fragmentTransaction.replace所有Fragment,然后添加新的。根据 谷歌

这与为所有当前添加的片段调用 remove(Fragment) 基本相同,这些片段使用相同的 containerViewId 添加,然后使用此处给出的相同参数调用 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();

(我知道我没有使用 backstack,但我对此有点困惑。)

于 2015-07-31T08:32:00.127 回答
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()
于 2019-05-19T07:36:18.323 回答