android - Android 导航组件通过 safeArgs 和深度链接传递参数
问题描述
我有一个用于以下功能的导航 xml -
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/navigation_featureB.xml"
app:startDestination="@id/FragmentB">
<fragment
android:id="@+id/FragmentB"
android:name="FragmentB"
android:label="FragmentB">
<deepLink app:uri="App://FragmentB" />
</fragment>
</navigation>
在我的FeatureA
片段中,我执行以下操作 -
val uri = Uri.parse("App://FragmentB")
findNavController().navigate(uri)
我知道如何在safeArgs
没有深层链接的情况下使用。如何通过深度链接将数据传递给其他功能?
解决方案
您可以执行以下操作
首先添加参数navigation.xml
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/navigation_featureB.xml"
app:startDestination="@id/FragmentB">
<fragment
android:id="@+id/FragmentB"
android:name="FragmentB"
android:label="FragmentB">
<argument
android:name="yourarg"
android:defaultValue="Argument Default Value"/>
<deepLink app:uri="App://FragmentB/{yourarg}" />
</fragment>
</navigation>
然后你可以这样称呼它
val args = Bundle()
args.putString("yourarg", "Argument Value")
val deeplink = findNavController().createDeepLink()
.setDestination(R.id.FragmentB)
.setArguments(args)
.createPendingIntent()
val builder = NotificationCompat.Builder(
context, "deeplink")
.setContentTitle("Deep link with data")
.setContentText("Deep link with data to Android")
.setSmallIcon(R.drawable.ic_android)
.setContentIntent(deeplink)
.setAutoCancel(true)
val notificationManager =
context?.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notificationManager.notify(0, builder.build())
已编辑
无通知
首先,在 navigation.xml 中添加参数
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/navigation_featureB.xml"
app:startDestination="@id/FragmentB">
<fragment
android:id="@+id/FragmentB"
android:name="FragmentB"
android:label="FragmentB">
<argument
android:name="yourarg"
android:defaultValue="Argument Default Value"/>
<deepLink app:uri="App://FragmentB/{yourarg}" />
</fragment>
</navigation>
然后你可以这样称呼它
val uri = Uri.parse("App://FragmentB/yourarg")
findNavController().navigate(uri)
然后您可以使用此代码获取参数
val argument = arguments?.getString("yourarg")
// Or with Safe Args
val safeArgs: FragmentBArgs by navArgs()
val yourarg = safeArgs.yourarg
参考: https ://codelabs.developers.google.com/codelabs/android-navigation#9
推荐阅读
- python - 为 pandas 中的每个组分配一个等级
- angular - Recaptcha google 上 Angular 6 的实现
- php - 从 php 中的站点中删除 index.php
- javascript - Meteor + LitElement (Polymer 3) 导入问题
- azure - Azure Key Vault 中的最大机密数?
- android - 为什么使用“--prod --release android”构建的 Ionic 3 apk 会给 Google Playstore 错误,即 apk 在调试模式下签名?
- javascript - 使用 javascript 的删除数据功能只能工作一次
- tfs - 从 TFS 2017 中的 AreaID 获取区域详细信息
- javascript - 使用 JavaScript 拦截网页中接收到的数据
- django - 使用 Django ManyToManyField 检查实例是否存在