Android Jetpack Nested (via include) Navigation Missing Arguments

January 31, 2020
Generated Directions class’s action method takes zero arguments

If your navigation graph refer to a nested graph via <include /> tag, the generated Directions class (e.g. AlbumFragmentDirections.actionAlbumToImage) will have missing arguments even though <arguments /> is available in the nested graph.

To solve this, you need to make redundant <argument /> declaration in the <action /> tag to the <include /> graph.

In the following example, AlbumFragment have an action to image (which is a nested <include/> graph), so it need a redundant <argument /> decleration within the <action /> tag.

<?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/album"
    app:startDestination="@id/nav_album">

    <fragment
        android:id="@+id/nav_album"
        android:name="com.luasoftware.journey.view.sub.AlbumFragment"
        android:label="Album"
        tools:layout="@layout/album" >
        <action
            android:id="@+id/action_album_to_image"
            app:destination="@id/image">
            <!-- redundant argument declaration necessary for nested graph -->
            <argument
                android:name="default"
                app:argType="com.luasoftware.journey.model.args.ImageArgs" />
        </action>
    </fragment>

    <include app:graph="@navigation/image" />
</navigation>

image.xml

<?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/image"
    app:startDestination="@id/nav_image">

    <fragment
        android:id="@+id/nav_image"
        android:name="com.luasoftware.journey.view.support.ImageFragment"
        android:label="Image"
        tools:layout="@layout/image" >
        <!-- actual argument declaration -->
        <argument
            android:name="default"
            app:argType="com.luasoftware.journey.model.args.ImageArgs" />
    </fragment>
</navigation>
This work is licensed under a
Creative Commons Attribution-NonCommercial 4.0 International License.