【问题标题】:fragmentManager.getBackStackEntryCount() does not decrease when removing fragment from manager从管理器中删除片段时,fragmentManager.getBackStackEntryCount() 不会减少
【发布时间】:2018-11-06 14:36:16
【问题描述】:

我想要的正确行为是:

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();

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

提前致谢。

【问题讨论】:

  • 你能提供一个SSCCE吗?
  • 什么意思? :')
  • @LucaCorradi 正如我所写,它没有任何效果并解决了我的问题,即使根据文档是相同的:developer.android.com/reference/android/support/v4/app/…
  • @m0skit0 我一般做一个控件,如果FragmentB在片段管理器中不存在则什么都不会被删除,我忘记添加了,现在在项目示例中修复它

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


【解决方案1】:

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

popBackStack() 是异步的——它将要弹出的请求排入队列,但在应用程序返回到其事件循环之前不会执行该操作。

【讨论】:

  • 都是一样的,我问的也没什么区别。
【解决方案2】:

FragmentManager 的回栈只在两种情况下更新:

  1. 您使用 addToBackStack() 提交 FragmentTransaction
  2. 您拨打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。

【讨论】:

    猜你喜欢
    • 2023-03-21
    • 1970-01-01
    • 2015-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-07
    相关资源
    最近更新 更多