Как сопоставить NavArgs с NavArgument? - PullRequest
0 голосов
/ 05 марта 2019

Проблема, с которой я столкнулся, связана с программной настройкой графика навигации.Чего я хочу добиться, так это решить в Activity, какой фрагмент должен быть начальным пунктом назначения.Более того, у каждого из этих фрагментов есть дополнительные аргументы.

Допустим, у нас есть такой график навигации:

<?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"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/nav_graph">

    <fragment
        android:id="@+id/fragment1"
        android:name="com.mypackage.Fragment1"
        tools:layout="@layout/layout_fragment1">

        <argument
            android:name="argument1"
            app:argType="int" />

    </fragment>

    <fragment
        android:id="@+id/fragment2"
        android:name="com.mypackage.Fragment2"
        tools:layout="@layout/layout_fragment2">

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

    </fragment>

</navigation>

Если мы используем плагин Safe Args (androidx.navigation.safeargs.kotlin), два класса будутсгенерировано: Fragment1Args и Fragment2Args, оба реализуют интерфейс NavArgs.

Теперь, когда нам нужно решить, какой фрагмент должен стать начальным пунктом назначения, нам нужно сделать граф программно:

val graph = navController.navInflater.inflate(R.navigation.nav_graph)
if (someCondition) {
    graph.startDestination = R.id.fragment1
} else {
    graph.startDestination = R.id.fragment2
}
navController.graph = graph

Но Fragment1 и Fragment2 требуют дополнительных аргументов, поэтому нам нужно как-то добавить их в граф.Оказывается, у графа есть метод addArguments(NavArguments), но, как вы видите, это не интерфейс NavArgs.Вопрос в том, как правильно установить эти аргументы, которые Fragment1 или Fragment2 смогут извлечь?

Я использую 1.0.0-rc02 версию фреймворка навигации.

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Когда вы добавляете тег <argument> в XML навигации, он уже создает классы NavArgument при вызове inflate(), поэтому вам ничего не нужно делать с графиком, чтобыпередать аргументы в начальный пункт назначения.

Вместо этого следует использовать setGraph(NavGraph, Bundle), чтобы установить график и передать начальные аргументы в начальный пункт назначения.

// Construct your Bundle of arguments
val bundle = bundleOf()
// set the graph with specific arguments for the start destination
navController.setGraph(graph, bundle)
0 голосов
/ 05 марта 2019

Вы сказали: «Чего я хочу добиться, так это решить в Деятельности, какой фрагмент должен быть начальным пунктом назначения».

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

when (someCondition) {
        TO_FRAGMENT_1-> {
            findNavController(R.id.fragment).navigate(R.id.fragment1)
        }
        TO_FRAGMENT_2-> {
            findNavController(R.id.fragment).navigate(R.id.fragment2)
        }
    }

И если действие является первым действием в вашем приложении, вы должны использовать что-то ещевместо аргументов, например: SharedPref.

...