我遇到的问题与以编程方式设置导航图有关。我要实现的是在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),将生成两个类:Fragment1ArgsFragment2Args,都实现了NavArgs接口(interface)。

现在,因为我们需要确定哪个片段应成为起始目标,所以我们需要以编程方式制作图形:
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接口(interface)。问题是如何正确设置Fragment1或Fragment2将能够提取的这些参数?

我正在使用导航框架的1.0.0-rc02版本。

最佳答案

当您将<argument>标记添加到导航XML时,调用NavArgument时已创建类,因此已经创建了,因此您无需对图形进行任何操作即可将参数传递给起始目标。

相反,您应该使用 inflate() 设置图形并将初始参数传递给起始目标。

// Construct your Bundle of arguments
val bundle = bundleOf()
// set the graph with specific arguments for the start destination
navController.setGraph(graph, bundle)

关于android - 如何将NavArgs映射到NavArgument?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54992140/

10-10 07:10