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

Jon*_*n I 5 java android android-fragments fragmentmanager fragment-backstack

我想要的正确行为是:

Fragment A -> Fragment B -> Fragment C -> Fragment A
Run Code Online (Sandbox Code Playgroud)

我目前所做的:

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

我真的需要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();
Run Code Online (Sandbox Code Playgroud)

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

提前致谢。

ian*_*ake 0

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

  1. 您使用提交 FragmentTransactionaddToBackStack()
  2. 你打电话popBackStack()

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

如果您希望堆栈从AA -> B,您可以使用 FragmentTransaction 和addToBackStack(通常是一个replace操作):

fragmentManager.beginTransaction()
    .replace(R.id.fragmentContainer, fragmentB)
    .addToBackStack("b")
    .commit();
Run Code Online (Sandbox Code Playgroud)

然后,您希望返回堆栈为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();
Run Code Online (Sandbox Code Playgroud)

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

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

// Pop C, returning back to A
fragmentManager.popBackStack("c", FragmentManager.POP_BACK_STACK_INCLUSIVE)
Run Code Online (Sandbox Code Playgroud)

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