app:navGraph 속성은 NavHostFragment를 탐색 그래프와 연결합니다. 탐색 그래프는 사용자가 이동할 수 있는 이 NavHostFragment의 모든 대상을 지정합니다.
app:defaultNavHost="true" 속성을 사용하면 NavHostFragment가 시스템 뒤로 버튼을 가로챕니다. 하나의 NavHost만 기본값으로 지정할 수 있습니다. 동일한 레이아웃에 여러 호스트가 있다면(예: 창이 2개인 레이아웃) 한 호스트만 기본 NavHost로 지정해야 합니다.
java.lang.IllegalStateException: View androidx.fragment.app.FragmentContainerView{64699eb V.E...... ......I. 0,0-0,0 #7f080132 app:id/nav_host_fragment} does not have a NavController set
오류가 발생했다.
binding으로 불러온 FragmentContainerView에서 NavController를 찾는게 실패한 것 같다.
따라서 아래 코드로 Type casting을 시도했다.
val navHostFragment = binding.navHostFragment as NavHostFragment
val navController = navHostFragment.navController
binding.bottomNavigationView.setupWithNavController(navController)
어림없다. 이번엔 cast 오류다
Caused by: java.lang.ClassCastException: androidx.fragment.app.FragmentContainerView cannot be cast to androidx.navigation.fragment.NavHostFragment
우리는 FragmentContainerView를 사용하여 NavHostFragment를 만들었다.
위와 같이 supportFragmentManager에서 findFragmentById를 사용해 직접 해당 FragmentContainerView를 검색해서 해당 View가 지닌 Class속성인 navHostFragment로 TypeCasting을 해야 가져올 수 있다.
val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
val navController = navHostFragment.navController
binding.bottomNavigationView.setupWithNavController(navController)