如何在android中清除Fragment backstack

ven*_*enu 49 android android-fragments

嗨如何使用下面的逻辑清除片段后堆栈它不工作...

for(int i = 0; i < mFragmentManager.getBackStackEntryCount(); ++i) {            
     mFragmentManager.popBackStack();
}
Run Code Online (Sandbox Code Playgroud)

帮我..

dra*_*ula 114

试试这个

mFragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
Run Code Online (Sandbox Code Playgroud)

  • 这只会弹出顶级状态,如果不止一个,则不会清除背斜. (14认同)
  • 请详细说明,因为这是最好的解决方案之一.如果您在清除后立即向backstack添加新内容,则可能需要调用popBackStackImmediate. (5认同)

小智 73

上面的答案几乎是正确的,但你需要在片段后面列表中保护,因为它可以是空的:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 17

while (getSupportFragmentManager().getBackStackEntryCount() > 0){
    getSupportFragmentManager().popBackStackImmediate();
}
Run Code Online (Sandbox Code Playgroud)

  • 但它显示了最后一个.通常,之后您只需将新片段添加到Backstack. (2认同)

Bla*_*elt 15

一种方法是标记,backstack以及何时清除它

mFragmentManager.popBackStack("myfancyname", FragmentManager.POP_BACK_STACK_INCLUSIVE);
Run Code Online (Sandbox Code Playgroud)

其中,"myfancyname"应符合您所使用的字符串addToBackStack.例如

Fragment fancyFragment = new FancyFragment();     
fragmentTransaction.replace(R.id.content_container, fancyFragment, "myfragmentag");
fragmentTransaction.addToBackStack("myfancyname");
Run Code Online (Sandbox Code Playgroud)

backstack的名字和片段的标签名称可以相同,但没有约束在这方面

从文档中

如果已设置,并且已提供后备栈条目的名称或ID,则将使用所有匹配的条目,直到找到不匹配的条目或达到堆栈的底部.否则,将删除所有条目,但不包括该条目.

如果您不想为后台堆栈使用名称,则可以使用第一个参数

 mFragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
Run Code Online (Sandbox Code Playgroud)


Ric*_*ung 9

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

FragmentManager manager = getFragmentManager();
FragmentManager.BackStackEntry first = manager.getBackStackEntryAt(0);
manager.popBackStack(first.getId(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
Run Code Online (Sandbox Code Playgroud)

非常自我解释; 您只需获取第一个条目,获取其ID,然后弹出所有内容,包括具有该ID的条目.