Android Navigation Component : Pass value (arguments) in fragments

So I forgot to go through this link : Define Destination Arguments

But this answer helpful to all lazy peoples like me:

Add dependency in project level build.gradle:

classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.1.0"

Apply plugin in app level build.gradle:

apply plugin: "androidx.navigation.safeargs"

Using XML: predefined (static) value:

In xml file of navigation /navigation/mobile_navigation.xml declare argument tag as below or you can design through this link:

<fragment
    android:id="@+id/nav_privacy_policy"
    android:name="com.sohamerp.marsremedies.fragment.PrivacyPolicyFragment"
    android:label="@string/menu_privacy_policy"
    tools:layout="@layout/fragment_privacy_policy" >
    <argument
        android:name="privacyPolicyLink"
        app:argType="string"
        android:defaultValue="http://sohamerp.com/avo/avo_privacy_policy.html"/>
</fragment>

<fragment
    android:id="@+id/nav_terms"
    android:name="com.sohamerp.marsremedies.fragment.PrivacyPolicyFragment"
    android:label="@string/menu_terms"
    tools:layout="@layout/fragment_terms_condition" >
    <argument
        android:name="privacyPolicyLink"
        app:argType="string"
        android:defaultValue="http://sohamerp.com/avo/avo_privacy_policy.html"/>
</fragment>

Now you have to write code in your Fragment like:

if(getArguments() != null) {
    // The getPrivacyPolicyLink() method will be created automatically.
    String url = PrivacyPolicyFragmentArgs.fromBundle(getArguments()).getPrivacyPolicyLink();
}

Hope it will helps you others.


In this scenario, you can use

  private NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
  // Create the Bundle to pass, you can put String, Integer, or serializable object
  Bundle bundle = new Bundle();
  bundle.putString("link","http://yourlink.com/policy");
  bundle.putSerializable("USER", user); // Serializable Object
  navController.navigate(R.id.nav_terms, bundle); // called fragment with agruments

In case of any help you can reply on it


Simple and fast solution:

pass arguments between destinations

Bundle bundle = new Bundle();
bundle.putString("amount", amount);
Navigation.findNavController(view).navigate(R.id.confirmationAction, bundle);

and receiving

TextView tv = view.findViewById(R.id.textViewAmount);
tv.setText(getArguments().getString("amount"));