web-dev-qa-db-ja.com

Android Navigation Component:値(引数)をフラグメントで渡す

私がやった事:

Navigation Drawer Activityを作成しましたNavigation Drawer Activityの新しいフォーマットを更新しました新しいAndroidアーキテクチャ、ナビゲーションコンポーネント構造で取得しました。

以下のNavigationViewNavControllerを含むNavigationUIコードは、ナビゲーション項目をクリックしたときにopening fragmentです。

    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);

これは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" />

これを使用してナビゲーションが発生しています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>

私がやりたいこと:

次に、Fragmentが呼び出されたときに、一部の値をバンドル(引数)として渡します。

シナリオ:2つのフラグメントPrivacyPolicyFragmentTermsConditionsFragmentがあります。どちらのフラグメントでも、それに応じてWebView内のリンクを開いています。 Privacy Policyのメニュー項目をクリックすると、関連するリンクが渡されます。

この新しい構造navigation/mobile_navigation.xmlの開始フラグメントでは、どのように引数を渡すことができますか?

何か助けは?

3
Pratik Butani

NavigationView.OnNavigationItemSelectedListenerを実装して、次のようにすることができます。

 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
    }

そしてxmlでは、受信フラグメントに引数を追加できます。この場合は

   <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