【问题标题】:Fragment Transaction is added to backstack even if disallowAddToBackStack is called即使调用了 disallowAddToBackStack,也会将 Fragment Transaction 添加到 backstack
【发布时间】:2021-03-12 20:51:34
【问题描述】:

这里是repo这个bug的示例代码:

如果我连续替换 3 个片段,并禁用第二个片段添加到后台堆栈中。

        fragmentManager = supportFragmentManager
        val fargmentA = FragmentA()
        fragmentManager.beginTransaction().replace(R.id.container, fargmentA).addToBackStack("a").commitAllowingStateLoss();

        val fargmentB = FragmentB()
        fragmentManager.beginTransaction().replace(R.id.container, fargmentB).disallowAddToBackStack().commitAllowingStateLoss();
        
        val fargmentC = FargmentC()
        fragmentManager.beginTransaction().replace(R.id.container, fargmentC).addToBackStack("c").commitAllowingStateLoss();

在上述事务之后,我调用了popBackStack():

  val count = fragmentManager.backStackEntryCount;
        for(i in 0 until count ){
            fragmentManager.popBackStackImmediate()
        }

我仍然可以看到从 FragmentB 调用的 onCreateView() 方法,我不允许将其添加到 backstack。

这是一个已知的错误还是片段管理器的行为方式?

谢谢!

【问题讨论】:

  • 你认为disallowAddToBackStack() 在做什么?它所做的只是使您无法按照its documentation 对那个人FragmentTransaction 调用addToBackStack
  • @ianhanniballake 对,所以这意味着我没有将片段 b 事务添加到后台堆栈中,对吗?为什么popBackStack() 会恢复fragmentB?

标签: android android-fragments fragmentmanager


【解决方案1】:

有两点需要牢记:

  1. replace() 相当于在当前添加到该容器的每个片段上调用 ​​remove(),然后使用您的新片段调用 add(),因此带有 fragmentC 的事务将在其操作中删除 fragmentB /li>
  2. popBackStack() 让您完全处于交易前的状态。这意味着fragmentC 被删除(add() 的反面)和 fragmentB 被添加(remove() 的反面)

这意味着弹出您的fragmentC 交易预计将带回fragmentB - 您的disallowAddToBackStack() 只是意味着您的fragmentB 交易可以永远被撤销。

当在同一个容器上混合addToBackStack() 和非addToBackStack() 片段事务时,这实际上有一些严重的影响:在你执行fragmentB 事务之后,没有办法回到@ 987654338@.

一般来说,这意味着如果您确实想要这样做,您可以用

替换您的非返回堆栈fragmentB 事务
fragmentManager.popBackStack()
val fargmentB = FragmentB()
fragmentManager.beginTransaction().replace(R.id.container, fargmentB).addToBackStack("b").commitAllowingStateLoss();

这将确保所有交易都使用addToBackStack(),并且在每一步都按预期进行逆转。

请注意,您的每一笔交易都应按照Fragment transaction guide 使用setReorderingAllowed(true)。这将防止片段向上移动到更高的生命周期级别然后立即向下移动的情况,并确保像 popBackStack()commit() 这样的组合操作一起作为单个原子转换运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-30
    • 2013-08-07
    • 2013-06-18
    • 1970-01-01
    • 2022-07-19
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    相关资源
    最近更新 更多