Как передать аргументы фрагменту, вызываемому из NavigationDrawer с помощью NavigationUI?

Я преобразовал свое приложение для использования NavigationUI, Но setupWithNavController() заменяет мой setNavigationItemSelectedListener(),

В моем слушателе я передавал (безопасный тип) аргумент к фрагменту.

1 ответ

Если кто-то все еще ищет ответ на этот вопрос. Я нашел полезный обходной путь с глобальными действиями NavigationUI (работа с альфа-09)

Вы можете предоставить действие верхнего уровня для своего графика навигации:

<?xml version="1.0" encoding="utf-8"?>
    <navigation xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/main_nav"
        app:startDestination="@id/mainFragment">
        ...
        <action android:id="@+id/action_global_mainFragment"
               app:destination="@id/mainFragment"/>
   </navigation>

И используйте его с вашим контроллером навигации, чтобы перемещаться с правильным пакетом, когда пользователь нажимает на элемент меню. Будьте осторожны, чтобы удалить.setupWithNavController (navController) вызов из вашего NavigationView, иначе он отменит ваше поведение.

Если я правильно понимаю ваш вопрос, то, что вы ищете:

Документация по параметрам навигации

Кратко:

На вашем графике навигации к фрагменту, которому вы хотите отправить значение, вы добавите аргумент.

<fragment android:id="@+id/myFragment" >
    <argument
        android:name="amount"
        app:argType="integer"
        android:defaultValue="0" />
</fragment>

Когда вы затем ссылаетесь на этот фрагмент как на действие, библиотека генерирует класс Directories, который будет выглядеть примерно так:

 val action = SpecifyAmountFragmentDirections.confirmationAction(amount)
 v.findNavController().navigate(action)

Имена генерируются на основе того, что вы назвали фрагмент и действия. Также обратите внимание на то, что можно отправлять целые объекты, если они также являются Parcelable.

Если рассматриваемый фрагмент является начальным назначением вашего графика, я не уверен, что вы можете сделать это прямо сейчас. Обходным путем может быть загрузка данных во фрагмент? Или, может быть, в общую ViewModel из Activity?

Удачи!

Другие вопросы по тегам