从堆栈中弹出特定片段并删除其他片段
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;
【讨论】:
如果这是从托管片段的活动中调用的,则不起作用。以上是关于从堆栈中弹出特定片段并删除其他片段的主要内容,如果未能解决你的问题,请参考以下文章