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

时间:2018-11-06 14:36:17

标签: java android android-fragments fragmentmanager fragment-backstack

我想要的正确行为是:

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的条目。

我真的需要将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();

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

谢谢。

2 个答案:

答案 0 :(得分:0)

仅在以下两种情况下更新FragmentManager的后堆栈:

  1. 您使用addToBackStack()
  2. 提交FragmentTransaction
  3. 您致电popBackStack()

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

如果您希望堆栈从AA -> B,则可以将FragmentTransaction与addToBackStack(通常是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();

这可确保在将FragmentB添加到后置堆栈之前,先从堆栈中删除FragmentC

类似地,如果您要删除FragmentC并返回到FragmentA,则只需从后堆栈中弹出它即可:

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

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

答案 1 :(得分:0)

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

popBackStack()是异步的-它使弹出请求入队,但是直到应用程序返回其事件循环时才执行该操作。