Android 在使用 NavController 时向上导航正确的图表

Posted

技术标签:

【中文标题】Android 在使用 NavController 时向上导航正确的图表【英文标题】:Android navigate up the right graph when using NavController 【发布时间】:2019-08-10 16:54:45 【问题描述】:

我目前在我的项目中使用 android 导航架构。它具有可以使用快捷方式启动任何片段的功能。 假设我的导航图如下所示:A->B->C->D。 当我在片段 A 时,我使用 NavController.navigate(R.id.fragment_d) 直接导航到片段 D。但是当我按下后退按钮时,它会返回到片段 A。有没有办法让目的地导航回导航图中的父级? (我的意思是,在这种情况下,D 回到 C,B 然后回到 A)。 提前致谢。

【问题讨论】:

发布你的导航功能。 【参考方案1】:

通常,您应始终避免在自己的应用中创建合成后退堆栈(并且仅在从应用外部的深层链接启动应用时才这样做,即通过app shortcut)。

但是,您可以通过以下两种方式之一来解决此问题:

    如果您可以重置 A 上的状态,您可以使用 NavDeepLinkBuilder 构造一组适合在所选目的地重新启动任务的 Intent:

    navController.createDeepLink()
      .setDestination(R.id.destination_d)
      .createTaskStackBuilder()
      .startActivites()
    

    只需多次拨打navigate()

    navController.navigate(R.id.destination_b)
    navController.navigate(R.id.destination_c)
    navController.navigate(R.id.destination_d)
    

【讨论】:

感谢您的回答,但它不能解决我的问题。第一个选项不起作用,第二个选项是不可能的,因为我只想知道最后一个目的地而不知道通往它的目的地。 当你说“没用”时,你必须更具体。如果您不知道您想要在后台堆栈上的哪些目的地,您如何期望知道要添加什么?有人必须知道:-) 要求是你可以通过快捷方式快速导航到任何片段。如果您想导航到该片段,自然的方式是在导航图中可视化。 (假设每个片段都想使用快捷方式进行导航,以便在导航图中只有一个起点)。所以,我想要在后面的堆栈上以自然的方式到达那个目的地的片段。【参考方案2】:

如果您正确地为您的片段引入了父片段,我认为您应该能够在目的地使用navControler.navigateUp()。另外,请考虑设备后退按钮和向上返回箭头之间的区别以向上到父项

【讨论】:

以上是关于Android 在使用 NavController 时向上导航正确的图表的主要内容,如果未能解决你的问题,请参考以下文章

当我在 LiveData 观察者中使用 navController 时,Android Navigation 组件图停止正常工作

如何摆脱 Android-Kotlin 中的 `Unresolved reference: NavController` 错误?

Android NavController:如何用相同的动作打开相同的片段

Android开发 报错: xxx does not have a NavController set on xxx

Android开发 关于navigation destination xxx is unknown to this NavController 报错的复现分析与解决

IllegalStateException:链接没有设置 NavController