【问题标题】:Prevent destroying (or restore state) of Fragment B when navigating back from D - Navigation Component从 D 导航返回时防止破坏(或恢复状态)片段 B - 导航组件
【发布时间】:2020-02-01 17:36:12
【问题描述】:

我有片段:A、B、C、D。我导航 A -> B 。片段 B 从参数中获取并保存状态。然后我导航 B -> C。然后 C -> D。当我调用 两次 findNavController().popBackStack() 我得到正确的行为:D -> B 和 B 仍然具有正确的状态。它之所以有效,是因为片段 B 从未被破坏,只是它的视图。然后返回时重新创建视图。但不建议调用两次 popBackStack()。我们应该使用 app:popUpToapp:popUpToInclusive="true" 的操作:

<action
    android:id="@+id/action_fragmentD_to_fragmentB"
    app:destination="@id/fragmentB"
    app:popUpTo="@+id/fragmentB"
    app:popUpToInclusive="true" />

但是它强制片段 B 被完全销毁然后重新创建。 Bu 没有以前的状态

换句话说,我想在使用 FLAG_ACTIVITY_CLEAR_TOP + FLAG_ACTIVITY_SINGLE_TOP 时实现与活动相同的行为:https://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_CLEAR_TOP

【问题讨论】:

  • 为什么不建议调用两次 popBackStack()?
  • @Mr.AF 运行动画两次。
  • 如果我想返回 5 次怎么办?我还应该运行 popBackStack() 5 次吗?这没有意义。

标签: android kotlin android-jetpack android-architecture-navigation android-jetpack-navigation


【解决方案1】:

如果您不想导航到 fragmentB 的新实例(因为这就是 app:destination 所做的),则不需要在操作上使用 app:destination="@id/fragmentB"。因此您可以使用:

<action
    android:id="@+id/action_fragmentD_to_fragmentB"
    app:popUpTo="@+id/fragmentB" />

这与调用 popBackStack(R.id.fragmentB, false) 相同 - 即,弹回 fragmentB,但不弹出 fragmentB 本身。

【讨论】:

    【解决方案2】:

    您可以使用 SingleLiveEvent 类来保留之前的状态,因为它只会在需要时发出一次数据。

    了解有关 SingleLiveEvent 的更多信息:

    【讨论】:

    • 我知道 SingleLiveEvent 是什么。我看不出答案和问题之间的联系
    猜你喜欢
    • 1970-01-01
    • 2017-07-05
    • 2020-07-07
    • 1970-01-01
    • 2017-08-04
    • 1970-01-01
    • 2019-03-22
    • 2021-06-20
    相关资源
    最近更新 更多