54

嗨,如何清除片段回堆栈正在使用以下逻辑它不起作用...

for(int i = 0; i < mFragmentManager.getBackStackEntryCount(); ++i) {            
     mFragmentManager.popBackStack();
}

帮我..

4

6 回答 6

123

尝试这个

mFragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
于 2013-06-14T11:06:05.067 回答
80

上面的答案几乎是正确的,但是您需要在片段返回列表周围设置一个守卫,因为它可以为空:

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);
    }
}
于 2014-04-27T19:38:14.777 回答
19
while (getSupportFragmentManager().getBackStackEntryCount() > 0){
    getSupportFragmentManager().popBackStackImmediate();
}
于 2014-07-31T13:24:41.180 回答
17

一种方法是标记backstack当你想清除它

mFragmentManager.popBackStack("myfancyname", FragmentManager.POP_BACK_STACK_INCLUSIVE);

其中"myfancyname"应该与您使用的字符串匹配addToBackStack。例如

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);
于 2013-06-14T11:05:49.663 回答
11

这有点晚了,但我自己也遇到了这个问题。你可以做:

FragmentManager manager = getFragmentManager();
FragmentManager.BackStackEntry first = manager.getBackStackEntryAt(0);
manager.popBackStack(first.getId(), FragmentManager.POP_BACK_STACK_INCLUSIVE);

非常不言自明;您只需获取第一个条目,获取其 ID,然后弹出所有内容,包括具有该 ID 的条目。

于 2013-12-15T06:05:51.750 回答
0

我见过的最好的选择就在这里。

            int count = getSupportFragmentManager().getBackStackEntryCount();
            if (count > 0) {
                getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
            }
于 2017-10-02T12:19:17.643 回答