【问题标题】:popBackStack() behavior differs after support-library upgrade from 23.1.1 to 25.1.0支持库从 23.1.1 升级到 25.1.0 后 popBackStack() 行为不同
【发布时间】: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


【解决方案1】:

注意新的支持25.1.0

片段生命周期发生了一些变化。
现在有新功能可以优化操作并推迟片段转换。

阅读: https://code.google.com/p/android/issues/detail?id=230415

【讨论】:

  • 是的,谢谢,我已经意识到了。即使我使用 transaction.setAllowOptimization(false); 没有任何变化并且 onCreateView() 仍然被调用。但是您是否认为这是新优化的影响,我们可能无法切换到旧行为?
  • 我认为新的生命周期也会改变你的交易和行为。
  • 我也认为这可能是新的优化。同时我对谷歌问题发表了评论,也许开发人员可以对此说些具体的事情。在本地我也更改了我的代码,以便onCreateView() 不再再次调用 FragmentTransaction。我认为其他人也在考虑这个问题,希望我们能得到更多信息。
【解决方案2】:

有类似的问题。在 25.3.0 中修复

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-18
    • 2017-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多