在两个片段之间传递参数,每个片段都位于不同的导航图中

bel*_*len 5 android android-architecture-navigation android-safe-args

使用 Android 导航组件。我有两个导航图(每个都有自己的流程),比如说导航图 A 和 B。我成功地从 A 导航到 B,但我无法设法将图 A 中包含的最后一个 Fragment 的参数传递给属于图 B 的起始片段。

我能够在属于同一图表的片段之间传递参数,但在导航图表之间导航时不会生成设置参数的函数。

我正在尝试使用 safeargs 来实现这一点。

这是导航图代码:

导航图A:

<navigation android:id="@+id/nav_graph_a"
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        app:startDestination="@id/fragment1">

<fragment
    android:id="@+id/fragment1"
    android:name="com.mypackage.fragments.Fragment1"
    android:label="Fragment1">
    <action
        android:id="@+id/action_fragment1_to_fragment2"
        app:destination="@id/fragment2"/>

</fragment>

<fragment
    android:id="@+id/fragment2"
    android:name="com.mypackage.fragments.Fragment2"
    android:label="Fragment2">
    <argument
        android:name="thisArgumentAlwaysArrive"
        android:defaultValue="null"
        app:argType="string"/>
    <action
        android:id="@+id/action_fragment2_to_nav_graph_b"
        app:destination="@id/nav_graph_b"/>
</fragment>

<include app:graph="@navigation/nav_graph_b"/>
Run Code Online (Sandbox Code Playgroud)

导航图B:

<navigation android:id="@+id/nav_graph_b"
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        app:startDestination="@id/fragment3">

<fragment
    android:id="@+id/fragment3"
    android:name="com.mypackage.fragments.Fragment3"
    android:label="Fragment3">

    <argument
        android:name="thisArgumentNeverArrive"
        app:argType="string"/>
</fragment>
Run Code Online (Sandbox Code Playgroud)

关于如何实现这一目标有什么想法吗?

ego*_*zal 0

Safe Args 是 Gradle 的插件,它为目标创建 ClassArgs 类。默认控制器提供了一种导航到另一个 NavGraph 的方法,在本例中,有一个名为 NavGraphNavigator 的导航器实现。该导航器为您提供navigate(NavGraph destination,Bundle args)将参数传递给起始片段的函数。

因此,我发现实现您想要实现的目标的最佳方法是使用生成的类来生成包含所需参数的包。

var myBundle = YourFragmentIdInNavGraphArgs.Builder(var args..).toBundle()
Run Code Online (Sandbox Code Playgroud)

然后使用默认的 NavController 导航到这样的 navGraph 目的地。

view.findNavController().navigate(R.id.your_action_to_nav_graph_id,myBundle)
Run Code Online (Sandbox Code Playgroud)

导航器的实现将负责将参数传递给目的地的起始片段。

希望它对某人有所帮助。