Навигационный компонент Android, передающий аргумент с safeArgs и deep link

#android #kotlin #android-jetpack #android-jetpack-navigation

#Android #kotlin #android-jetpack #android-jetpack-навигация

Вопрос:

У меня есть 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 без глубокой ссылки.
Как мне передать данные другой функции с помощью deep link?

Ответ №1:

Вы можете сделать следующее

Сначала добавьте аргумент в 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

Комментарии:

1. Другого способа нет? Я просто хочу открыть фрагмент в другой функции в том же приложении, и нужны ли мне для этого уведомления?

2. пожалуйста, проверьте мой обновленный ответ, я указал способ без использования уведомления

3. Это помогает, большое спасибо 🙂 Я принял ответ. Но есть ли возможность использовать safeArgs с глубокими ссылками?

4. Конечно, рад, что это помогло 🙂 Да, можно использовать safeArgs, я снова обновил ответ 🙂

5. Это касается только строковых типов данных, но во многих приложениях нам нужно передавать пользовательские объекты с глубокой ссылкой. Есть ли что-нибудь, что мы можем это сделать?