Jetpack Navigation如何将DeepLink存为Kotlin与XML均可引用的常量
Android跨Kotlin/XML统一DeepLink常量方案
共有两种成熟方案可实现一处定义、两端复用,无需硬编码:
方案1:单字符串资源+占位替换(零额外配置,最常用)
直接在字符串资源中定义带导航参数占位格式的DeepLink,Kotlin端使用时替换占位符即可:
- 定义字符串资源
<!-- values/strings.xml --> <string name="deeplink_prefix">android-app://example.google.app</string> <string name="fragment_two_deeplink">@string/deeplink_prefix/fragment_two/{arg}</string>
- 导航图XML直接引用
<!-- nav_graph.xml 可直接识别大括号参数格式 --> <deepLink app:uri="@string/fragment_two_deeplink" />
- Kotlin代码中替换占位符使用
val argValue = "传入的参数值" val targetUri = context.getString(R.string.fragment_two_deeplink) .replace("{arg}", argValue) .toUri() val request = NavDeepLinkRequest.Builder .fromUri(targetUri) .build()
如果有多个参数,按格式增加{param1}、{param2}占位逐一替换即可。
方案2:Gradle统一配置(源头唯一,适合多模块共享)
如果需要多模块全局复用,可在Gradle中定义一次常量,同时生成Kotlin可用的BuildConfig字段和XML可用的字符串资源:
- 模块build.gradle.kts配置
android { // 开启BuildConfig生成 buildFeatures { buildConfig = true } defaultConfig { // 统一定义DeepLink相关常量 val deeplinkPrefix = "android-app://example.google.app" val fragmentTwoDeeplink = "$deeplinkPrefix/fragment_two/" // 生成Kotlin端可调用的BuildConfig常量 buildConfigField("String", "DEEPLINK_PREFIX", "\"$deeplinkPrefix\"") buildConfigField("String", "FRAGMENT_TWO_DEEPLINK", "\"$fragmentTwoDeeplink\"") // 生成XML端可调用的字符串资源 resValue("string", "deeplink_prefix", deeplinkPrefix) resValue("string", "fragment_two_deeplink", fragmentTwoDeeplink) } }
- 导航图XML使用
<!-- 直接拼接资源和参数占位即可 --> <deepLink app:uri="@string/fragment_two_deeplink{arg}" />
- Kotlin代码使用
val argValue = "传入的参数值" val targetUri = "${BuildConfig.FRAGMENT_TWO_DEEPLINK}$argValue".toUri() val request = NavDeepLinkRequest.Builder .fromUri(targetUri) .build()
注意事项
- 导航图中声明的argument名称要和DeepLink中大括号内的参数名完全一致,否则参数解析会失败
- 公共前缀建议单独抽离,后续修改域名/Scheme只需要修改一处即可全局生效
内容的提问来源于stack exchange,提问作者Serge
相关产品推荐
相关产品推荐

