Navigation Component父导航图如何暴露子模块Fragment/Dialog目的地?
DeepLink传递integer数组参数实现方法
Navigation Component原生支持从DeepLink Uri中解析数组类型参数,可按以下步骤实现:
- 给目标目的地配置DeepLink规则,在
singleTranslationHadithDetailDialog的导航配置中添加deepLink标签:
<deepLink android:id="@+id/deepLink_hadith_detail" app:uri="app://hadith/detail?references={references}" />
- 构造跳转Uri时,使用重复查询参数的形式传递数组值,Navigation 2.4.0及以上版本会自动将同名的多个查询参数合并为数组:
// 示例待传递的整数数组 val references = intArrayOf(101, 102, 103) val uri = Uri.Builder().apply { scheme("app") authority("hadith") path("/detail") references.forEach { ref -> appendQueryParameter("references", ref.toString()) } }.build() // 执行跳转 navController.navigate(uri)
如果使用低版本Navigation,可改为传递逗号分隔的参数字符串,在目标目的地自行拆分转换为整数数组即可,兼容性更强。
该场景下其他更优解决方案
DeepLink并不是跨模块跳转的最优选择,你可以根据业务场景选择以下更简单的方案:
- 配置全局Action:在主导航图根节点下定义指向目标目的地的全局Action,全局Action可从任意当前目的地触发跳转,无需担心找不到目的地的问题,同时支持类型安全的参数传递:
<!-- 主导航图根节点下添加 --> <action android:id="@+id/action_global_to_hadith_detail" app:destination="@id/singleTranslationHadithDetailDialog"> <argument android:name="references" app:argType="integer[]" app:nullable="false" /> </action>
跳转时直接调用生成的Safe Args方法即可:
val direction = NavGraphDirections.actionGlobalToHadithDetail(references) navController.navigate(direction)
- 公共导航抽离:将需要跨模块访问的目的地定义抽到公共的导航XML文件中,所有需要跳转的模块都引入该公共导航文件,各模块即可直接识别目标目的地ID。
- 公共导航模块:将所有导航图定义、Safe Args生成的类都放到独立的公共基础模块中,各业务子模块依赖该公共模块,即可直接使用类型安全的Directions类完成跨模块跳转。
内容的提问来源于stack exchange,提问作者Riajul
相关产品推荐
相关产品推荐

