【问题标题】:Back navigation after deeplink by navigation architecture component通过导航架构组件进行深度链接后的返回导航
【发布时间】:2019-02-06 13:04:58
【问题描述】:

当我从深层链接(用户点击 URL)打开应用程序并按下返回按钮时,我希望用户导航到导航图中的上一个片段,但它只是退出了应用程序。

文档说后退导航的工作方式应该与用户自然进入该屏幕的方式相同。

我可以在导航图中以某种方式指定所需的 backstack 吗?或者可以在深度链接后自动形成回栈?对于旧版本的库,我发现后按后它应该导航到我的导航图的根目录,但这不会发生。

我正在使用来自 Android 架构组件(版本 1.0.0-beta01)的导航库。

【问题讨论】:

  • 我遇到了同样的问题,我的用例是我在某些情况下从应用程序本身触发 handleDeeplink 方法,该方法应该根据给定的 url 降落在不同的目的地,但此方法清除当它到达目的地时的backstack。正如您所提到的,这是新版本的导航组件中引入的更改。你有没有发现它周围的任何东西或联系了谷歌团队?

标签: android android-architecture-components android-architecture-navigation


【解决方案1】:

我发现这里发生了什么,对于explicit deep links,它应该转到一个新的后退堆栈,如果用户自然导航到视图而不是现有的后退堆栈(现有堆栈已被清除),这就是您的应用程序所拥有的.

当用户通过显式深层链接打开您的应用时,任务返回堆栈将被清除并替换为深层链接目标。嵌套图时,每个嵌套级别的起始目标(即层次结构中每个元素的起始目标)也将添加到堆栈中。这意味着当用户从深层链接目的地按下返回按钮时,他们会向后导航导航堆栈,就像他们从入口点进入您的应用一样。

对于implicit 这有点奇怪。你可以让它做explicit 所做的事情,但设置Intent.FLAG_ACTIVITY_NEW_TASK 否则back buttonnavigation up 按钮会做两件不同的事情:

  1. back button 将按照您的预期执行,它会回到您的应用程序现有的后台堆栈并加载该片段。

  2. 然而up buttonclearback stack 生成一个新的,就好像它是explicit link

如果未设置该标志,您将保留在触发隐式深层链接的上一个应用程序的任务堆栈中。在这种情况下,“后退”按钮会将您带回到上一个应用,而“向上”按钮会在导航图中的分层父目标上启动应用的任务。kquote

来源:Android Documentation

【讨论】:

【解决方案2】:

正如here描述的后退按钮应该返回上一个片段,你可以在Java中手动设置它:button.setOnClickListener(Navigation.createNavigateOnClickListener(R.id.next_fragment, null));

像这样在 Kotlin 中:button.setOnClickListener(Navigation.createNavigateOnClickListener(R.id.next_fragment, null))

Android 系统维护一个包含上次访问目的地的回退堆栈。当用户打开应用程序时,您的应用程序的第一个目的地被放置在堆栈中。每次调用 navigate() 方法都会在堆栈顶部放置另一个目的地。相反,按下 Up 或 Back 按钮会分别调用 NavController.navigateUp() 和 NavController.popBackStack() 方法,以将顶部目标从堆栈中弹出。

确保您在托管片段活动中使用NavHostFragment 而不是<fragment>

【讨论】:

  • 问题是关于深层链接的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-22
  • 1970-01-01
  • 1970-01-01
  • 2019-03-14
  • 1970-01-01
相关资源
最近更新 更多