Navigation Componentを使っていて嵌ったポイント
update
@FKbelm さんからfindFragmentById
を使えば大丈夫だと教えてもらいました。
ハマったこと
Navigation Componentを使って、ToolbarをActivityに持たせていたら、該当のViewを表示する時に
java.lang.IllegalStateException: Activity Caused by: java.lang.IllegalStateException: Activity {Activity} does not have a NavController set on {nav_host_fragmentのid}
が出た。
原因
FragmentContainerViewを使って、
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:layout_scrollFlags="enterAlways|scroll" />
</com.google.android.material.appbar.AppBarLayout>
<androidx.fragment.app.FragmentContainerView
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_behavior="@string/appbar_scrolling_view_behavior"
app:navGraph="@navigation/nav_graph" />
のように書いてると
toolbar.setupWithNavController(findNavController(R.id.nav_host_fragment))
でNavControllerが見つからないと例外が投げられる。
対策
FragmentContainerViewじゃなくfragmentを使えばいい。
val navController = supportFragmentManager.findFragmentById(R.id.nav_host_fragment)
toolbar.setupWithNavController(navController!!.findNavController())
という呼び方をすれば大丈夫そう
余談
lintでfragmentをFragmentContainerViewに変えろって言われるけど、今は無視するしかなさそう。