android - 即使调用了 disallowAddToBackStack,也会将 Fragment Transaction 添加到 backstack
问题描述
这是一个回购这个错误的示例代码:
如果我连续替换 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() 方法,我不允许将其添加到后台堆栈。
这是一个已知的错误还是片段管理器的行为方式?
谢谢!
解决方案
有两个主要的事情要记住:
replace()
相当于调用remove()
当前添加到该容器的每个片段,然后add()
使用您的新片段调用,因此该事务fragmentC
将fragmentB
作为其操作的一部分删除popBackStack()
使您完全处于交易前的状态。这意味着fragmentC
被删除(与 相反add()
)和 fragmentB 被添加(与 相反remove()
)
这意味着预计弹出您的fragmentC
交易将fragmentB
带回 - 您disallowAddToBackStack()
只是意味着您的fragmentB
交易永远不会被撤销。
当涉及到同一容器上的混合事务addToBackStack()
和非分addToBackStack()
片事务时,这实际上会产生一些严重的影响:在您执行fragmentB
事务之后,就无法返回到fragmentA
.
通常,这意味着如果您确实想要这样做,您可以将非回栈fragmentB
事务替换为
fragmentManager.popBackStack()
val fargmentB = FragmentB()
fragmentManager.beginTransaction().replace(R.id.container, fargmentB).addToBackStack("b").commitAllowingStateLoss();
这将确保所有交易addToBackStack()
的使用和逆转在每一步都按预期工作。
请注意,您的每一笔交易都应setReorderingAllowed(true)
按照片段交易指南使用。这将防止片段向上移动到更高的生命周期级别然后立即向下移动的情况,并确保像 apopBackStack()
和commit()
一起这样的组合操作作为单个原子转换运行。
推荐阅读
- python - 如果特定列存在于带有 Pandas 的两个 DataFrame 中,则替换列值
- css - 在 Reactjs 中悬停在父 div 上无法正常工作
- typescript - 打字稿将联合类型传递给仅接受其中一种类型的函数
- angular - 在服务器响应 401 错误后使用拦截器附加正确的令牌
- javascript - 如何覆盖材质 UI 组件中的自动完成选择选项
- r - 带有组和构面的堆叠 ggplot 条形图的百分比标签
- javascript - 如何从 JavaScript 对象创建 HTML 表格?
- android - 无法在我的手机上将 android 包设置为系统应用程序
- arrays - 通过数组/缓存减少执行时间的代码???谷歌应用脚本
- python - 如何将 CustomDataAsset 传递给 DataContext 以在批处理上运行自定义期望?