Navigation Architecture Component- Passing argument data to the startDestination

Ahmed Abd-Elmeged picture Ahmed Abd-Elmeged · May 14, 2018 · Viewed 24.7k times · Source

I have an activity A that start activity B passing to it some intent data. Activity B host a navigation graph from the new Navigation Architecture Component.I want to pass that intent data to the startDestination fragment as argument how to do that?

Answer

Elliot Schrock picture Elliot Schrock · May 22, 2018

TLDR: You have to manually inflate the graph, add the keys/values to the defaultArgs, and set the graph on the navController.

Step 1

The documentation tells you to set the graph in the <fragment> tag in your Activity's layout. Something like:

<fragment
    android:id="@+id/navFragment"
    android:name="androidx.navigation.fragment.NavHostFragment"
    app:graph="@navigation/nav_whatever"
    app:defaultNavHost="true"
    />

REMOVE the line setting the graph=.

Step 2

In the Activity that will be displaying your NavHostFragment, inflate the graph like so:

val navHostFragment = navFragment as NavHostFragment
val inflater = navHostFragment.navController.navInflater
val graph = inflater.inflate(R.navigation.nav_whatever)

Where navFragment is the id you gave your fragment in XML, as above.

Step 3 [Crucial!]

Create a bundle to hold the arguments you want to pass to your startDestination fragment and add it to the graph's default arguments:

val bundle = Bundle()
// ...add keys and values
graph.addDefaultArguments(bundle)

Step 4

Set the graph on the host's navController:

navHostFragment.navController.graph = graph