如何在android中清除Fragment backstack

时间:2013-06-14 11:01:29

标签: android android-fragments

如何使用以下逻辑清除片段后备栈,它不起作用......

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

帮帮我......

6 个答案:

答案 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);
            }