【发布时间】:2017-01-11 09:17:17
【问题描述】:
从 Android 支持库 23.1.1 升级到最新的 25.1.0 后,popBackStack() 的行为在我们的应用程序中发生了变化。
例如,我在 BackStack 上有三个 FragmentTransactions。现在第四个 FragmentTrsansaction 被添加到 BackStack。 FragmentTransactions 是这样的:
FragmentTransaction transaction = fragmentManager.beginTransaction()
.replace(R.id.fragment_container_single, target, CoreActivity.FRAGMENT_TAG_LEFT)
.addToBackStack(<CONCRETE_TRANSACTION_NAME>)
.commit();
Fragment#4 具有在 onViewCreated() 期间自动路由到 Fragment#5 的逻辑(我知道,它很难看,我必须更改它)。无论如何,当我想离开 Fragment#5 时,我想恢复到 Fragment#4 之前显示的 Fragment。我按交易名称执行此操作:
getFragmentManager().popBackStack(“<CONCRETE_TRANSACTION_NAME_4>”, FragmentManager.POP_BACK_STACK_INCLUSIVE);
或者这个:
getFragmentManager().popBackStack(“<CONCRETE_TRANSACTION_NAME_3>”, 0);
但是通过此调用,将调用 Fragment#4 的 onCreateView() 和 onViewCreated(),并且 Fragment#5 将立即添加到 BackStack。即使我恢复到 Fragment#1 onViewCreated() 为 BackStack 上的每个 Fragment 调用 - 对于 Fragment#2、Fragment#3 和 Fragment#4,即使它们对于我想返回的 FragmentTransaction 无关紧要。
在支持库23.1.1下成功跳转回Fragment#3。 Fragment#4 在不调用 onViewCreated() 的情况下弹出包含在内。这对我来说似乎更直观和正确,因为我的 FragmentTransaction “外部”的片段调用 onViewCreated() 似乎没有必要?
我知道,addToBackStack() 只保存事务状态,而不是片段本身,片段可能需要重新创建。
有类似的posts,但我想了解为什么它在支持库更新后中断。我在任何地方都找不到变化。这是一个错误还是现在是一个错误?
我将继续更改我的代码。
感谢您的帮助!
更新 升级到支持库 25.1.0 后,我遇到了更多生命周期问题/更改。有一个Google issue,我在其中还评论了我的问题。目前我不得不回到最新的 24.2.1 并密切关注这个话题。这只是我的临时解决方案。这些问题从支持库 25.0.0 开始。
【问题讨论】:
-
我在这个版本中的后退按钮有问题。我想知道它是否也与这个生命周期问题有关。 Activity 实例再次创建。
-
我检查了这个。当我回去时,我的活动没有重新创建。它在活动之间像预期的那样暂停和恢复。但是通过片段的返回行为已经改变了它的顺序。似乎它与新的库版本无关。例如,由于内存不足,您的 Activity 可能会被 Android 重新创建?
-
当我使用支持 25.x 时,使用后退按钮后出现崩溃。当我回到 24.x 时,它运行良好。几个设备。当我有时间时,我必须提炼出最小可行测试。
标签: android android-fragments android-support-library back-stack