使用Navigation Component 2.4.0-alpha01实现跨Fragment返回栈编程导航
问题解决方案
功能支持性说明
Navigation 2.4.0-alpha01版本已经支持跨返回栈跳转任意目的地,你遇到的报错不是版本不支持导致的。
报错原因
你定义的跳转action属于Title Fragment所在的子导航图的局部action,局部action只能跳转同子导航图内的目的地。而你要跳转的Leaderboard属于底部导航另一个菜单项对应的独立子导航图,当前子导航图的节点中没有注册该目的地,因此触发了目的地找不到的异常。
正确实现方式
方式1:使用全局action跳转
在根导航图的顶层直接定义全局action,全局action可以从任意子导航图的目的地触发跳转:
<!-- 根导航图下直接定义全局action --> <action android:id="@+id/action_global_to_leaderboard" app:destination="@id/leaderboard" <!-- 可选配置:是否保留目标子栈的历史返回记录 --> app:popUpTo="@id/leaderboard_nav" app:popUpToInclusive="false" />
跳转时直接调用全局action即可:
findNavController().navigate(R.id.action_global_to_leaderboard)
方式2:直接指定目的地id跳转
不需要提前定义action,只要目的地id在整个导航图全局唯一,直接调用跳转方法即可:
findNavController().navigate(R.id.leaderboard)
方式3:同步切换底部导航选中状态
如果需要跳转后同步更新底部导航的选中状态,直接操作底部导航控件即可,效果和用户手动点击菜单项完全一致:
bottomNavigationView.selectedItemId = R.id.leaderboard_nav
注意事项
- 2.4.0-alpha01属于早期测试版本,多返回栈存在状态丢失、跳转异常等已知bug,建议升级到2.4.0稳定版及以上版本使用。
- 所有子导航图的目的地id必须全局唯一,不能出现重名id,否则会导致跳转匹配错误。
- 如果需要跳转后清空目标子栈的历史返回记录,可在跳转action中配置
app:popUpToInclusive="true"属性。
内容的提问来源于stack exchange,提问作者michal3377
相关产品推荐
相关产品推荐

