使用 Android 导航组件的条件返回导航

Conditional back navigation with Android Navigation Component

我使用 Jetpack 中的导航组件在我的应用程序中进行导航。 我的应用程序中有 3 个屏幕,它们都是通过 Fragment 实现的:
- 搜索屏幕
- 列表屏幕
- 详情屏幕

当用户按下搜索(在 search screen 上)时,应用程序导航到 list screen 加载结果并显示它们。用户选择其中一个结果并导航到 detail screen。如果只有一个结果,应用会自动从 list screen 导航到 detail screen,有效地跳过列表屏幕。

问题是返回导航:当有多个结果时我需要导航回 list screen,但如果只有一个结果我需要导航回 search screen。我只想调用 navigateUp,但这会将我带到 list screen(在所有情况下),然后如果只有一个结果则转到 detail screen

当直接使用 FragmentTransaction 时,我们可以 replace 当前片段并调用 addToBackStack 只有当我们想要 return 到它时。 当使用导航组件时,我们可以 navigate,它的行为是 replace + addToBackStack.

如何使用架构组件实现替换而不添加到后台堆栈行为?

在导航组件中,您可以使用方法NavController.popBackStack(int action),其工作方式类似于addToBackStack(null)

最后,我设法实现了它。 现在我有两个具有相同起点和终点的动作,它们唯一的区别是 popUpTo 属性。

<action
    android:id="@+id/action_listFragment_to_detailFragement"
    app:destination="@id/detailFragment"/>

<action
    android:id="@+id/action_listFragment_to_detailFragement_pop"
    app:destination="@id/detailFragment"
    app:popUpTo="@id/listFragment"
    app:popUpToInclusive="true" />

action_listFragment_to_detailFragement在用户手动执行转换时使用,它应该return稍后列出屏幕

action_listFragment_to_detailFragement_pop 用于自动执行转换且列表屏幕不应在 return 之后显示。

只需使用 { Safe-Args Directions } 而不是 ID:


override fun navigateTo(navController: NavController) {
    val action = 
        FirstFragmentDirections.actionFirstFragmentToSecondFragment()
    navController.navigate(action)
}