【问题标题】:Fragment is not removed from BackStack片段未从 BackStack 中删除
【发布时间】:2015-10-03 05:54:33
【问题描述】:

我使用 BackStack 来存储片段,它工作正常。但是,当我想从 BackStack 中删除一个片段时,什么也没有发生。 我检查了一些问题,例如this,发现他们确实像我一样使用 popBackStack 从 BackStack 中删除了一个项目,但它对我不起作用。

这是我的代码:

    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    int count = getSupportFragmentManager().getBackStackEntryCount();

    String currentTag = getSupportFragmentManager().getBackStackEntryAt(getSupportFragmentManager().getBackStackEntryCount() - 1).getName();
    Fragment currentInstance = getSupportFragmentManager().findFragmentByTag(currentTag);
    fragmentTransaction.remove(currentInstance);
    fragmentTransaction.commit();
    fragmentManager.popBackStack(getSupportFragmentManager().getBackStackEntryCount() - 1, FragmentManager.POP_BACK_STACK_INCLUSIVE);
    int count1 = getSupportFragmentManager().getBackStackEntryCount();

currentInstance 正确显示最上面的片段。有趣的是 count 和 count1 是相等的,并且在使用 popBackStack 命令后,堆栈中的最顶层项目仍然存在。所以我不能从堆栈中删除最上面的片段。

如果使用此代码:

        String previousTag = getSupportFragmentManager().getBackStackEntryAt(getSupportFragmentManager().getBackStackEntryCount() - 1).getName();
        Fragment previousInstance = getSupportFragmentManager().findFragmentByTag(previousTag);

        fragmentTransaction.replace(R.id.container_body, previousInstance,previousTag);
        fragmentTransaction.commit();

我可以用前一个片段替换片段,但这不是正确的方法,因为我不能返回多个片段。

【问题讨论】:

    标签: android android-fragments back-stack


    【解决方案1】:

    我发现:popBackStack 方法在调用后不会立即弹出。所以在我必须使用popBackStackImmediate 方法而不是popBackStack。 这是我最终更正的代码:

    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    if (getSupportFragmentManager().getBackStackEntryCount()> 0) {
       fragmentManager.popBackStackImmediate(getSupportFragmentManager().getBackStackEntryCount() - 1, FragmentManager.POP_BACK_STACK_INCLUSIVE);
    
       String previousTag = getSupportFragmentManager().getBackStackEntryAt(getSupportFragmentManager().getBackStackEntryCount() - 1).getName();
       Fragment previousInstance = getSupportFragmentManager().findFragmentByTag(previousTag);
    
      fragmentTransaction.replace(R.id.container_body, previousInstance, previousTag);
      fragmentTransaction.commit();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多