【问题标题】:How to clear Fragment backstack in android如何在android中清除Fragment backstack
【发布时间】:2013-06-14 11:01:28
【问题描述】:

您好,如何清除片段回栈我使用下面的逻辑它不起作用...

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

帮帮我..

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

    试试这个

    mFragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
    

    【讨论】:

    • 请详细说明,因为这是最好的解决方案之一。如果您在清除后立即向后台堆栈添加新内容,则可能需要调用 popBackStackImmediate。
    • 这只会弹出顶部状态,如果超过一个则不会清除后台堆栈。
    • 这会在使用新的 Fragment 提交事务之前加载前一个 Fragment。您看不到它,但以编程方式在新片段之前调用前一个片段的onActivityCreated()
    【解决方案2】:

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

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

    【讨论】:

    • 这是迄今为止我发现的最好的答案,它承认了实际问题。荣誉。
    【解决方案3】:
    while (getSupportFragmentManager().getBackStackEntryCount() > 0){
        getSupportFragmentManager().popBackStackImmediate();
    }
    

    【讨论】:

    • 如果您详细说明,这应该是公认的答案。清除整个 backstack 是我们想要的
    • 但它显示了最后一个。通常,之后您只需将新片段添加到 backstack。
    • 这里需要注意的是,像这样在循环中弹出 backstack 会在它弹出的所有片段(创建方法和关闭方法)中调用生命周期事件,这可能会让您意想不到副作用。
    【解决方案4】:

    一种方法是标记 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, 然后所有匹配的条目将被消耗,直到一个不匹配的条目 找到匹配或到达堆栈底部。否则,所有 最多但不包括该条目的条目将被删除。

    如果你不想为你的 backstack 使用名字,你可以使用第一个参数

     mFragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
    

    【讨论】:

    • 你如何给backstack命名?
    • Gokhan,名字不是backstack的名字,是Fragment的标签名。对于他的例子,他弹出的片段应该是这样添加的:mFragmentManager.beginTransaction().add(mFragment, "myfancyname");
    【解决方案5】:

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

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

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

    【讨论】:

      【解决方案6】:

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

                  int count = getSupportFragmentManager().getBackStackEntryCount();
                  if (count > 0) {
                      getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
                  }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-03-07
        • 2011-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多