fragmentManager.getBackStackEntryCount() 从管理器中删除片段时不会减少

fragmentManager.getBackStackEntryCount() does not decrease when removing fragment from manager

我想要的正确行为是:

Fragment A -> Fragment B -> Fragment C -> Fragment A

我目前在做什么:

  1. 当我想从B回到A时,我用popBackStack()还在这里 一切顺利。
  2. 当我想从 B 转到 C 时,我删除 B 并 添加 C.(片段数 2,backStackEntryCount 数 3,替换相同)。
  3. 当我想从C回到A时,我可以使用 popBackStack() 但 BackStackEntryCount 仍将包含 B.
  4. 条目

我真的需要backStackEntryCount与管理器中包含的片段相同

有人知道我做错了什么吗?

我的代码:

        Fragment fragment1 = fragmentManager.findFragmentByTag("NavigationFragment_");
    if (fragment1 != null) {
        fragmentManager.beginTransaction()
                .setTransition(TRANSIT_FRAGMENT_FADE)
                .remove(fragment1)
                .commit();

    }

    fragmentManager.beginTransaction()
            .addToBackStack(backstack)
            .setTransition(TRANSIT_FRAGMENT_OPEN)
            //.remove(getFragmentManager().findFragmentByTag(NavigationFragment_.class.getSimpleName()))
            .add(R.id.fragmentContainer, fragment, fragment.getClass().getSimpleName())
            .commit();

我一直在寻找解决方案,但没有结果,所以请不要将其标记为重复。

提前致谢。

FragmentManager 的返回堆栈仅在两种情况下更新:

  1. 您使用 addToBackStack()
  2. 提交了一个 FragmentTransaction
  3. 你打电话给popBackStack()

没有其他操作会影响返回堆栈 - 没有 addToBackStack() 的其他 FragmentTransactions 只会更改当前状态,不会影响调用 popBackStack() 等时发生的情况

如果您希望您的堆栈从 A 变为 A -> B,您将使用带有 addToBackStack 的 FragmentTransaction(通常是 replace 操作):

fragmentManager.beginTransaction()
    .replace(R.id.fragmentContainer, fragmentB)
    .addToBackStack("b")
    .commit();

那么,你想让你的返回栈从A -> BA -> C,你需要做两个操作:

// First pop B
fragmentManager.popBackStack("b", FragmentManager.POP_BACK_STACK_INCLUSIVE)
// Then addToBackStack C
fragmentManager.beginTransaction()
    .replace(R.id.fragmentContainer, fragmentC)
    .addToBackStack("c")
    .commit();

这可确保在将 FragmentC 添加到返回堆栈之前从堆栈中删除您的 FragmentB

同样,如果你想删除 FragmentC 并返回到 FragmentA,你只需将其从后栈中弹出即可:

// Pop C, returning back to A
fragmentManager.popBackStack("c", FragmentManager.POP_BACK_STACK_INCLUSIVE)

注意:在同一个 FragmentManager 中混合返回堆栈 FragmentTransactions 和常规 FragmentTransactions 从来都不是一个好主意,因为 popBackStack() 没有考虑 FragmentManager 的当前状态,而只是盲目地反转返回堆栈上的 FragmentTransaction(即最后一个带有 addToBackStack().

的 FragmentTransaction

如果您来这里是因为您调用了 popBackStack() 但 getBackStackEntryCount() 似乎没有更新,那么您可能想试试 popBackStackImmediate()。

popBackStack() 是异步的——它将请求排队以弹出,但直到应用程序 returns 进入其事件循环后才会执行操作。