Компонент архитектуры навигации - передача данных аргумента в startDestination с фрагментом

У меня есть fragment A, который содержит этот код:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    .......

    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/children_container"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:defaultNavHost="true"
        app:navGraph="@navigation/layout_navigation" />

    .......

</RelativeLayout>

которые начинают мой fragment B. Я хотел бы знать, как я могу передать какой-либо аргумент из fragmentA и получить в моем fragmentB.

Прочитав эту ссылку, но в ней говорилось о действии A из деятельности Б.

Я попытался удалить эту строку из моего FragmentContainerView.

app:navGraph="@navigation/layout_navigation"

И в моем fragmentA я добавил следующую строку:

val bundle = Bundle().apply {
    putString(KEY, "value")
}

NavHostFragment.create(R.navigation.layout_navigation, bundle)

В моем fragment B мой arguments равен нулю

Есть ли у вас какие-либо идеи?


comment
NavHostFragment.create(R.navigation.layout_navigation, bundle) Я вообще не понимаю эту строчку. Вы должны использовать Navigation.findNavController(this).navigate(R.id.some_destination, bundle).   -  person EpicPandaForce    schedule 26.04.2020
comment
по какой-то причине я должен был сделать это.. : val fragment = childFragmentManager.findFragmentById(R.id.children_container) ?: return val navController = NavHostFragment.findNavController(fragment) Тогда это работает ...   -  person LikseN    schedule 27.04.2020


Ответы (1)


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

введите здесь описание изображения

Выберите опцию «Аргументы» и нажмите +. Затем введите имя аргумента, тип данных и т. д.

введите здесь описание изображения

При вводе данных в диалоговом окне нажмите «Добавить».

Теперь откройте свой «fragmentA» и запустите navController.

val navController = Navigation.findNavController(view)

И перейдите к вашему «fragmentB» с данными в Bundle.

view.findViewById<Button>(R.id.openB).setOnClickListener { // <==== YOUR CLICK LISTENER THAT NAVIGATE TO FRAGMENT B
                navController.navigate(
                    R.id.action_fragmentA_to_fragmentB, // <==== YOUR ACTION ID (you can find it in your navigation graph XML file)
                    Bundle().apply {
                        putString("KEY", "My data") // <==== YOUR KEY AND DATA(data type should be similar to what you specified when create arguments in navigation graph XML file)
                    }
                )
            }

Теперь перейдите в файл "fragmentB" .java или .kt и получите данные по ключу

val data = arguments?.getString("KEY")

Надеюсь, мой ответ вам поможет!!

Вы также можете прочитать эту статью => передавать данные между фрагментами в компоненте навигации

person lincollincol    schedule 23.04.2020
comment
Я не могу использовать: findNavController в моем фрагменте A, когда я его использовал, у меня возникла следующая ошибка: не имеет набора NavController. Фактически, мой фрагмент A должен быть startDestination, но из-за следующей ошибки, которую я не понял, я создаю новый фрагмент B, который будет startDestination. Вот почему я хотел бы передать некоторые аргументы от fragmentA к fragmentB - person LikseN; 23.04.2020
comment
@LikseN попробуйте заменить ‹androidx.fragment.app.FragmentContainerView .../› во фрагменте Макет A на ‹fragment .../› Подробнее здесь =› stackoverflow.com/questions/50502269/ - person lincollincol; 23.04.2020
comment
ничего не изменилось, все равно получаю ту же ошибку @lincollincol - person LikseN; 23.04.2020