使用Android导航组件的条件反向导航

时间:2018-11-29 15:07:27

标签: android android-architecture-navigation

我正在使用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并调用navigate。 使用导航组件时,我们只能replace,它的行为就像addToBackStack + {{1}}。

如何使用体系结构组件实现不向后添加替换的行为?

3 个答案:

答案 0 :(得分:1)

最后,我设法实现了它。 现在,我有两个动作的起点和终点都相同,它们的唯一区别是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用于用户手动执行过渡,并且稍后应返回列表屏幕

action_listFragment_to_detailFragement_pop用于自动执行转换,并且返回后不应显示列表屏幕。

答案 1 :(得分:0)

在导航组件中,可以使用与NavController.popBackStack(int action)类似的方法addToBackStack(null)

答案 2 :(得分:0)

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


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

附注。 Vel_daN:爱​​你所做的。?