从 D 导航返回时防止破坏(或恢复状态)片段 B - 导航组件

Prevent destroying (or restore state) of Fragment B when navigating back from D - Navigation Component

我有片段: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_TOPhttps://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_CLEAR_TOP

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

了解有关 SingleLiveEvent 的更多信息:

如果您不想导航到 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 本身。