web-dev-qa-db-fra.com

Android Composant de navigation: transmettre la valeur (arguments) en fragments

Ce que j'ai fait:

J'ai créé Activité de tiroir de navigation , Comme nouveau format mis à jour de Activité de tiroir de navigation , Selon la nouvelle architecture Android Android, je l'ai eu avec Composant de navigation structure.

Le code NavigationView avec NavController et NavigationUI comme ci-dessous, qui est un fragment d'ouverture lorsque je clique sur un élément de navigation.

    DrawerLayout drawer = findViewById(R.id.drawer_layout);
    NavigationView navigationView = findViewById(R.id.nav_view);
    // Passing each menu ID as a set of Ids because each
    // menu should be considered as top level destinations.
    mAppBarConfiguration = new AppBarConfiguration.Builder(
            R.id.nav_home, R.id.nav_profile, R.id.nav_privacy_policy,
            R.id.nav_terms, R.id.nav_contact_us, R.id.nav_share, R.id.nav_send)
            .setDrawerLayout(drawer)
            .build();
    NavController navController = Navigation.findNavController(this, R.id.nav_Host_fragment);
    NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
    NavigationUI.setupWithNavController(navigationView, navController);

C'est pour nav_Host_fragment:

<fragment
        Android:id="@+id/nav_Host_fragment"
        Android:name="androidx.navigation.fragment.NavHostFragment"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        app:defaultNavHost="true"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:navGraph="@navigation/mobile_navigation" />

La navigation se passe en utilisant ce navigation/mobile_navigation.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/mobile_navigation"
    app:startDestination="@+id/nav_home">

    <fragment
        Android:id="@+id/nav_home"
        Android:name="com.sohamerp.marsremedies.fragment.HomeFragment"
        Android:label="@string/menu_home"
        tools:layout="@layout/fragment_home" />

    <fragment
        Android:id="@+id/nav_profile"
        Android:name="com.sohamerp.marsremedies.fragment.ProfileFragment"
        Android:label="@string/menu_my_profile"
        tools:layout="@layout/fragment_profile" />

    <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" />

    <fragment
        Android:id="@+id/nav_terms"
        Android:name="com.sohamerp.marsremedies.fragment.TermsConditionFragment"
        Android:label="@string/menu_terms"
        tools:layout="@layout/fragment_terms_condition" />

    <fragment
        Android:id="@+id/nav_contact_us"
        Android:name="com.sohamerp.marsremedies.fragment.ContactUsFragment"
        Android:label="@string/menu_contact_us"
        tools:layout="@layout/fragment_terms_condition" />

</navigation>

Ce que je veux faire:

Maintenant, je veux passer quelques valeurs sous forme de bundle (arguments) dans Fragment lors de son appel.

Scénario: J'ai deux fragments PrivacyPolicyFragment et TermsConditionsFragment, dans les deux fragments, j'ouvre simplement le lien dans WebView en conséquence. Donc, lorsque je clique sur l'élément de menu de Privacy Policy, Je passerai un lien en rapport avec le même.

Dans cette nouvelle structure navigation/mobile_navigation.xml fragments d'ouverture, Comment puis-je passer des arguments?

De l'aide?

3
Pratik Butani

Vous pouvez implémenter NavigationView.OnNavigationItemSelectedListener Et faites quelque chose comme ceci:

 override fun onNavigationItemSelected(item: MenuItem): Boolean {
   drawer_layout.closeDrawers()

        if (item.itemId == nv_navigation_drawer_navigation_view.checkedItem?.itemId)
            return false

     Handler().postDelayed({
                when (item.itemId) {
                    R.id.nav_privacy_policy -> {
                           val action = FragmentDirections.actionFragmentToPrivacyFragment("Policy link")

                     findNavController().navigate(action)

                    }
                }
            }, DRAWER_NAVIGATION_DELAY)
  return true
    }

Et en XML, vous pouvez ajouter un argument au fragment de réception, dans ce cas

   <fragment
    Android:id="@+id/nav_privacy_policy"
    Android:name=".fragment.PrivacyPolicyFragment"
    Android:label="@string/menu_privacy_policy"
    tools:layout="@layout/fragment_privacy_policy">

    <argument
        Android:name="policy"
        app:argType="string" />
</fragment>
1
bromden