使用Android Navigation组件进行有条件的后退导航

10
我在我的应用中使用 Jetpack Navigation 组件制作导航。我的应用有 3 个屏幕,它们都是通过 Fragment 实现的:
- 搜索屏幕
- 列表屏幕
- 详细信息屏幕

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

问题在于返回导航:当有多个结果时,我需要返回到 列表屏幕,但如果只有一个结果,则需要返回到 搜索屏幕。我只想调用 navigateUp,但这将把我带到 列表屏幕(在所有情况下),如果只有一个结果,则再前往详细信息屏幕

直接使用 FragmentTransaction 时,我们可以使用 replace 替换当前片段,并仅在稍后要返回时调用 addToBackStack。 使用导航组件时,我们可以直接 navigate,它的行为就像 replace + addToBackStack

如何使用架构组件实现“替换而不添加到返回堆栈”的行为?


你找到解决方案了吗? - John Sardinha
@JohnSardinha 是的,它在下面! - dhabensky
3个回答

10

最终,我学会了如何实现它。 现在我有两个动作,它们的起点和目的地相同,唯一的区别是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 用于自动执行转换,并且在返回后不应显示列表屏幕。


0

只需使用{安全参数方向}而不是ID:


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


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

我只是在NavController中有这个方法: public boolean popBackStack(@IdRes int destinationId, boolean inclusive) 顺便说一下,我想要相反的效果:跳过添加到后退栈。 - dhabensky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接