从堆栈中弹出特定的片段并删除其他片段

16

如何从栈中弹出特定片段并从一个片段中删除其他片段呢? 例如,这是我的片段,我现在在E。

A-> B -> C -> D ->E

想要从E返回到B并清除C和D。 我该怎么做?

5个回答

14

您可以在将片段添加到返回堆栈时为每个片段添加一个标记,然后从返回堆栈中弹出片段,直到达到所需的带有标记的片段。

FragmentManager fm = getFragmentManager();

for (int i = fm.getBackStackEntryCount() - 1; i > 0; i--) {
    if (!fm.getBackStackEntryAt(i).getName().equalsIgnoreCase(tagname)) {
        fm.popBackStack();
    }
    else
    {
     break;
    }
}

1
如果从托管片段的活动中调用此函数,则不起作用。 - Sreekanth Karumanaghat

10

当你在Fragment E中时,可以调用下面的函数:

getFragmentManager().popBackStack("tag", 0);

在这里,当将片段B添加到后退栈时,tag标签是作为字符串传递的。


4

如果您正在使用AndroidX导航,可以使用以下方法:

findNavController().popBackStack(R.id.FragmentB, false)

0

tldr:如果代码不起作用,请尝试使用fragmentManager而不是supportFragmentManager

解决方案:fragmentManager.popBackStackImmediate(tagName, 0)

我知道这是一个老问题,但在花费几个小时后,我无法接近所需的结果。

我正在使用supportFragmentManager,代码如下:

supportFragmentManager.popBackStackImmediate(tagName, 0)

但它既不能按照预期工作,也不符合文档中的说明。偶然间,我想到使用fragmentManager而不是supportFragmentManager,然后它奏效了!

因此,对于任何卡在这里的人,可以尝试一下这个方法。


0

使用以下代码弹出堆栈条目:

 FragmentManager fm = getSupportFragmentManager();

    if (fm.getBackStackEntryCount() > 0) {

        fm.popBackStack();

    }else {
        super.onBackPressed();
    }

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