如何使用以下逻辑清除片段后备栈,它不起作用......
for(int i = 0; i < mFragmentManager.getBackStackEntryCount(); ++i) {
mFragmentManager.popBackStack();
}
帮帮我......
答案 0 :(得分:110)
试试这个
mFragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
答案 1 :(得分:71)
上面的答案几乎是正确的,但你需要在片段后面列表中保护,因为它可能是空的:
private void clearBackStack() {
FragmentManager manager = getSupportFragmentManager();
if (manager.getBackStackEntryCount() > 0) {
FragmentManager.BackStackEntry first = manager.getBackStackEntryAt(0);
manager.popBackStack(first.getId(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
}
答案 2 :(得分:17)
while (getSupportFragmentManager().getBackStackEntryCount() > 0){
getSupportFragmentManager().popBackStackImmediate();
}
答案 3 :(得分:14)
一种方法是标记 backstack
以及何时清除它
mFragmentManager.popBackStack("myfancyname", FragmentManager.POP_BACK_STACK_INCLUSIVE);
其中"myfancyname"
应与您与addToBackStack
使用的字符串匹配。 E.g。
Fragment fancyFragment = new FancyFragment();
fragmentTransaction.replace(R.id.content_container, fancyFragment, "myfragmentag");
fragmentTransaction.addToBackStack("myfancyname");
backstack
的名称和片段的标签名称可以相同,但在这方面没有约束
来自文档
如果已设置,并且已提供后栈条目的名称或ID, 然后所有匹配的条目将被消耗,直到没有 找到匹配或达到堆栈的底部。否则,全部 最多但不包括该条目的条目将被删除。
如果您不想为后台堆栈使用名称,则可以使用第一个参数
mFragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
答案 4 :(得分:8)
这有点晚了,但我自己也遇到了这个问题。你可以这样做:
FragmentManager manager = getFragmentManager();
FragmentManager.BackStackEntry first = manager.getBackStackEntryAt(0);
manager.popBackStack(first.getId(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
非常自我解释;您只需获取第一个条目,获取其ID,然后弹出所有内容,包括具有该ID的条目。
答案 5 :(得分:0)
我见过的最佳选择就在这里。
int count = getSupportFragmentManager().getBackStackEntryCount();
if (count > 0) {
getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
}