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

时间:2020-02-01 17:36:12

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

我有片段: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被完全破坏,然后重新创建。以没有以前的状态来填充。

换句话说,当我使用FLAG_ACTIVITY_CLEAR_TOP + FLAG_ACTIVITY_SINGLE_TOPhttps://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_CLEAR_TOP

时,我希望实现与“活动”相同的行为

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:-1)