web-dev-qa-db-ja.com

下部のナビゲーションビューとAndroidナビゲーションコンポーネントを使用してフラグメントに引数を渡す方法は?

下部のナビゲーションビューとナビゲーションコンポーネントを使用して、フラグメントの引数を渡してアクセスすることはできますか?

私は、トップレベルのフラグメントが引数を必要とする、多くのフラグメントのアプローチを持つ1つのアクティビティを使用しています(通常、newInstanceで生成されたメソッドを介して行われます)。 Navigationコンポーネント開発者ガイドとコードラボを見てきましたが、safeargsの使用と宛先とアクションでの引数タグの追加についてのみ言及しています。

これが私のナビゲーショングラフです:

<navigation xmlns:app="http://schemas.Android.com/apk/res-auto" 
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools" 
    app:startDestination="@id/homeFragment">

    <fragment Android:id="@+id/homeFragment"
          Android:name="uk.co.homeready.homeready.HomeFragment"
          Android:label="fragment_home"
          tools:layout="@layout/fragment_home">
          <!--Do I create an argument block here?-->
    </fragment>

    <fragment Android:id="@+id/calculatorFragment"
          Android:name="uk.co.homeready.homeready.CalculatorFragment"
          Android:label="fragment_calculator"
          tools:layout="@layout/fragment_calculator"/>

    <fragment Android:id="@+id/resourcesFragment"
          Android:name="uk.co.homeready.homeready.ResourcesFragment"
          Android:label="fragment_resources"
          tools:layout="@layout/fragment_resources"/>

</navigation>

下部ナビゲーションビューメニュー:

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android">

    <item
        Android:id="@+id/homeFragment"
        Android:icon="@drawable/ic_home_black_24dp"
        Android:title="@string/title_home"/>

    <item
        Android:id="@+id/calculatorFragment"
        Android:icon="@drawable/ic_baseline_attach_money_24px"
        Android:title="@string/title_calculator"/>

    <item
        Android:id="@+id/resourcesFragment"
        Android:icon="@drawable/ic_baseline_library_books_24px"
        Android:title="@string/title_resources"/>

</menu>

主な活動:

override fun onCreate(savedInstanceState: Bundle?) {
        ...
        val navController = Navigation.findNavController(this, 
        R.id.nav_Host_fragment)
        bottom_navigation.setupWithNavController(navController)
        ....
}

activity_main.xml

<Android.support.constraint.ConstraintLayout>
    <fragment
        Android:id="@+id/nav_Host_fragment"
        Android:name="androidx.navigation.fragment.NavHostFragment"
        app:layout_constraintBottom_toTopOf="@id/bottom_navigation"
        app:defaultNavHost="true"
        app:navGraph="@navigation/nav_graph"/>

    <Android.support.design.widget.BottomNavigationView
        Android:id="@+id/bottom_navigation"
        app:menu="@menu/bottom_navigation"/>

</Android.support.constraint.ConstraintLayout>

HomeFragment

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    val argument = //TODO access argument here
    ...
}
13
skon

異なる引数を持つ同じ宛先を複数持つ可能性のある動的メニュー項目があるため、デフォルト値は使用できませんでした。 (サーバーから変更)

BottomNavigationView.OnNavigationItemSelectedListenerを実装します。

override fun onNavigationItemSelected(item: MenuItem): Boolean {
    val fragmentId = item.itemId
    val arguments = argumentsByFragmentId[fragmentId] // custom mutableMapOf<Int, Bundle?>() with arguments
    navController().navigate(fragmentId, arguments)
    return true
}

これを使用するには、リスナーを置き換えることにより、ナビゲーションを引き継ぎます。ここでの呼び出しの順序は重要です。

bottomNavigationView.setupWithNavController(navController)
bottomNavigationView.setOnNavigationItemSelectedListener(this)
0