web-dev-qa-db-ja.com

別のフラグメント内のNavhostFragmentを定義します

私はこのように私の中にNavhostFragmentを定義するフラグメントを持っています:

<fragment
        Android:id="@+id/shipping_Host_nav"
        Android:name="androidx.navigation.fragment.NavHostFragment"
        Android:layout_width="0dp"
        Android:layout_height="wrap_content"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:navGraph="@navigation/shipping_nav_graph"
        app:defaultNavHost="true"/>
 _

fragmentでFindNavControllerメソッドを呼び出しようとすると、それは不正な状態例外をスローし、私のビューグループにNAVコントローラがないと言っています。

    Java.lang.IllegalStateException: View androidx.core.widget.NestedScrollView{1dd5506 VFED..... ......I. 0,0-0,0} does not have a NavController set
 _

だから私の質問は次のとおりです。別のフラグメントの中でNavhostFragmentを定義できますか?または活動のみに適していますか?私は見つけるために多くのフラグメントの中にNAVホストの断片を定義することができますが、答えが見つかりませんでした。

6
Shalan93

この例外の解決策を見つけました、findnavcontroller()は、NavhostFragmentではなく、NavhostFragmentの中ではなくこのメソッドを呼び出すことを試みるときにこの例外をスローしてください。
[。ね。だから私はナビゲーションクラスを使って自分でコントローラを見つける必要があります

Navigation.findNavController(activity, R.id.my_nav_Host_fragment)
 _

これは、フラグメント内で定義されているNavhostFragment(Nav Controller)を見つける方法です。

フラグメントクラスの拡張機能を作成して、IDを使用してNAVコントローラを簡単に見つけることができます

fun Fragment.getFragmentNavController(@IdRes id: Int) = activity?.let {
    return@let Navigation.findNavController(it, id)
}
 _
3
Shalan93