如何通过深度链接跳转至include引入的嵌套导航图内的Fragment
问题解决方案
该需求完全可以实现,无需合并两个导航图的代码。
现象原因
你调用findNavController().currentDestination.hasDeepLink(Uri.parse("myapp://my/uri/path"))返回false属于正常表现:这个方法仅检查当前你所处的页面目的地本身是否配置了匹配的深链接,不会递归遍历整个导航树的其他节点、嵌套图内的目的地。当前你停留在主图的MyFragment页面,该页面没有配置对应深链接,自然返回false。
解决方法
- 直接触发深链接跳转
不需要提前校验当前目的地的深链接配置,直接调用NavController的navigate方法传入Uri即可,导航组件会自动遍历主图所有引入的嵌套图,找到匹配的目标页面完成跳转:
findNavController().navigate(Uri.parse("myapp://my/uri/path"))
- 提前校验全导航图是否存在对应深链接
如果有提前校验的需求,不要使用当前目的地的hasDeepLink方法,改用导航图根节点的hasDeepLink方法,它会递归扫描所有嵌套图的所有目的地,返回正确的匹配结果:
val hasTargetDeepLink = findNavController().graph.hasDeepLink(Uri.parse("myapp://my/uri/path"))
注意事项
- 如果需要支持外部应用/浏览器唤起深链接,要确保主Activity在
AndroidManifest.xml中配置了对应scheme的intent-filter,且关联了主导航图,系统唤起时导航组件会自动完成嵌套图内的页面跳转。 - 嵌套图的复用逻辑完全不受影响,你可以在任意需要用到这套导航流程的其他导航图中直接用
<include app:graph="@navigation/navigation_nested"/>引入,内部配置的深链接会自动被上层导航图识别。
内容的提问来源于stack exchange,提问作者Nicolás Carrasco-Stevenson
相关产品推荐
相关产品推荐

