You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Navigation Component父导航图如何暴露子模块Fragment/Dialog目的地?

跨模块Navigation Component跳转及整数数组参数传递解决方案

DeepLink传递integer数组参数实现方法

Navigation Component原生支持从DeepLink Uri中解析数组类型参数,可按以下步骤实现:

  1. 给目标目的地配置DeepLink规则,在singleTranslationHadithDetailDialog的导航配置中添加deepLink标签:
<deepLink
    android:id="@+id/deepLink_hadith_detail"
    app:uri="app://hadith/detail?references={references}" />
  1. 构造跳转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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 23:48:01