8

次のように、その中に 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"/>

フラグメントで findNavController メソッドを呼び出そうとすると、無効な状態例外がスローされ、ビュー グループに NavController がないことが示されました。

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

私の質問は、別のフラグメント内で NavHostFragment を定義できますか? またはアクティビティのみに適していますか? 別のフラグメント内で nav ホストフラグメントを定義できるかどうかを調べるために多くの検索を行いましたが、答えが見つかりませんでした。

4

1 に答える 1

9

この例外の解決策を見つけました。NavHostFragment ではない、または NavHostFragment 内にないフラグメント内でこのメソッドを呼び出そうとすると、findNavController() がこの例外をスローするため、フラグメントでこのメソッドを呼び出してこの間違いを犯しました。
そのため、Navigation クラスを使用して自分でコントローラーを見つける必要があります

Navigation.findNavController(activity, R.id.my_nav_host_fragment)

これは、フラグメント内で定義された NavHostFragment (NavController) を見つける方法です。

IDを使用してnavコントローラーを簡単に見つけることができるように、Fragmentクラスの拡張関数を作成しました

fun Fragment.getFragmentNavController(@IdRes id: Int) = activity?.let {
    return@let Navigation.findNavController(it, id)
}
于 2019-11-07T09:53:31.883 に答える