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

Posted

技术标签:

【中文标题】从堆栈中弹出特定片段并删除其他片段【英文标题】:pop specific fragment from stack and remove others 【发布时间】:2016-12-15 15:05:51 【问题描述】:

如何从堆栈中弹出特定片段并从片段中删除其他片段? 例如,这些是我的片段,我知道我在 E 中。

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

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

【问题讨论】:

【参考方案1】:

如果您使用的是 androidX 导航,则可以使用以下内容:

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

【讨论】:

【参考方案2】:

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

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

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

我使用的是 supportFragmentManager,代码是:

supportFragmentManager.popBackStackImmediate(tagName, 0)

但根据文档中的内容,它也没有按预期工作。 碰巧我想到了使用 fragmentManager 而不是 supportFragmentManager,瞧,它奏效了!

因此,对于任何坚持这一点的人,不妨试一试。

【讨论】:

【参考方案3】:

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

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

这里tag 是作为标记传递的字符串,同时将fragment B 添加到backstack

【讨论】:

【参考方案4】:

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

 FragmentManager fm = getSupportFragmentManager();

    if (fm.getBackStackEntryCount() > 0) 

        fm.popBackStack();

    else 
        super.onBackPressed();
    

【讨论】:

【参考方案5】:

你可以为每个片段添加一个标签,同时将它们添加到后台堆栈,然后从后台弹出片段,直到没有到达带有你想要的标签的片段。

FragmentManager fm = getFragmentManager();

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

【讨论】:

如果这是从托管片段的活动中调用的,则不起作用。

以上是关于从堆栈中弹出特定片段并删除其他片段的主要内容,如果未能解决你的问题,请参考以下文章

如何从后台弹出片段

Android - 从堆栈中间删除特定片段不起作用

没有调用 onresume 的弹回堆栈

方向更改时,片段视图为空

当特定 ViewController 类被推入另一个选项卡中的堆栈时,如何从堆栈中弹出视图控制器?

如何从一个片段中删除数据,这些片段应该反映在google firebase中的其他片段中