Передача аргумента между двумя фрагментами, каждый из которых находится в другом навигационном графе.

Использование компонента навигации Android. У меня есть два навигационных графика (каждый из них со своим собственным потоком), скажем, навигационные графы A и B. Я успешно перехожу от A к B, но мне не удается передать аргумент из последнего фрагмента, включенного в график A, в стартовый фрагмент, принадлежащий графу B.

Я могу передавать аргументы между фрагментами, принадлежащими одному и тому же графу, но функция для установки аргументов не генерируется при переходе между графами навигации.

Я пытаюсь сделать это с помощью safeargs.

Вот код навигационных графиков:

График навигации A:

<navigation android:id="@+id/nav_graph_a"
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        app:startDestination="@id/fragment1">

<fragment
    android:id="@+id/fragment1"
    android:name="com.mypackage.fragments.Fragment1"
    android:label="Fragment1">
    <action
        android:id="@+id/action_fragment1_to_fragment2"
        app:destination="@id/fragment2"/>

</fragment>

<fragment
    android:id="@+id/fragment2"
    android:name="com.mypackage.fragments.Fragment2"
    android:label="Fragment2">
    <argument
        android:name="thisArgumentAlwaysArrive"
        android:defaultValue="null"
        app:argType="string"/>
    <action
        android:id="@+id/action_fragment2_to_nav_graph_b"
        app:destination="@id/nav_graph_b"/>
</fragment>

<include app:graph="@navigation/nav_graph_b"/>

Navigation Graph B:

<navigation android:id="@+id/nav_graph_b"
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        app:startDestination="@id/fragment3">

<fragment
    android:id="@+id/fragment3"
    android:name="com.mypackage.fragments.Fragment3"
    android:label="Fragment3">

    <argument
        android:name="thisArgumentNeverArrive"
        app:argType="string"/>
</fragment>

Any idea on how to accomplish this?


person belen    schedule 10.12.2018    source источник
comment
Я сделал это в значительной степени, установив аргументы программно, используя правильный NavigationController. Можете ли вы предоставить здесь свой код?   -  person Mohammed    schedule 10.12.2018
comment
соответствующий NavigationController не позволяет мне устанавливать аргумент. Когда я смотрю в класс FragmentDirections, я не получаю setMyArgument метод ...   -  person belen    schedule 10.12.2018
comment
У меня точно такая же проблема. Подозреваю, что это ошибка навигационного компонента.   -  person AndroidDev    schedule 21.06.2019


Ответы (1)


Safe Args - это плагин для Gradle, который создает классы ClassArgs для пунктов назначения. Контроллер по умолчанию обеспечивает способ перехода к другому NavGraph, в этом случае есть реализация навигатора под названием NavGraphNavigator. Этот навигатор предоставляет вам функцию navigate(NavGraph destination,Bundle args), которая передает аргументы начальному фрагменту.

Итак, лучший способ, который я нашел, сделать то, что вы пытаетесь достичь, - это использовать сгенерированный класс для создания пакета с необходимыми аргументами.

var myBundle = YourFragmentIdInNavGraphArgs.Builder(var args..).toBundle()

а затем используйте NavController по умолчанию для перехода к пункту назначения navGraph, подобному этому.

view.findNavController().navigate(R.id.your_action_to_nav_graph_id,myBundle)

реализация навигатора позаботится о передаче аргументов стартовому фрагменту в пункте назначения.

Надеюсь, это поможет кому-то.

person egonzal    schedule 25.09.2019