android - fragment 未从 BackStack 中删除

标签 android android-fragments back-stack

我使用 BackStack 来存储 fragment ,它工作得很好。但是,当我想从 BackStack 中删除 fragment 时,什么也没有发生。 我检查了一些问题,例如 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 正确显示最上面的 fragment 。有趣的是,count 和 count1 相等,并且在使用 popBackStack 命令后,堆栈中最顶层的项仍然保留。所以我无法从堆栈中删除最上面的 fragment 。

如果使用此代码:

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

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

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

最佳答案

我发现: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();
}

关于android - fragment 未从 BackStack 中删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32919411/

相关文章:

java - 如何绕过 fragment 类中的静态引用?

android-fragments - 在没有 'FragmentPagerAdapter' 的 fragment 之间切换

android - 后台管理 : Restarter must be created only during owner's initialization stage

java - 错误: Error parsing XML: junk after document element when i put tabs Android

java - 将 java 转换为 kotlin 会中断上下文菜单

java - 使用支持包中的 fragment 创建选项卡栏

android - 使用 Android Navigation Architecture Component 重新创建 backstack

android - 剪切 ListView Android 中的文本

android - float 按钮和底部片断

android - 实现 "UP"按钮功能