我遇到的问题与以编程方式设置导航图有关。我要实现的是在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
接口(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/