android - FragmentContainerView 使用 findNavController

标签 android android-layout android-fragments android-navigation

我正在使用带有底部导航的 Android 导航组件,lint 会发出有关替换 <fragment> 的警告带有 <FragmentContainerView> 的标签但是当我更换时,findNavController不工作它给了我关于它没有设置 NavController 的错误
分段

<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:navGraph="@navigation/mobile_navigation" />
Activity
val navController = findNavController(R.id.nav_host_fragment)
    
    val appBarConfiguration = AppBarConfiguration(
        setOf(
            R.id.navigation_classes, R.id.navigation_schedule, R.id.navigation_settings
        )
    )
    setupActionBarWithNavController(navController, appBarConfiguration)
    navView.setupWithNavController(navController)
}

最佳答案

根据 this issue , 当使用 FragmentContainerView ,你需要找到NavController使用 findFragmentById()而不是使用findNavController()当在 onCreate() :

val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
val navController = navHostFragment.navController
这是因为 findNavController(R.id.nav_host_fragment)依赖于已经创建的 fragment View ,而使用 FragmentContainerView 时并非如此(因为它在引擎盖下使用 FragmentTransaction 来添加 NavHostFragment )。
如果您使用 Fragment 1.4.0或更高,View Binding ,您可以使用 getFragment() 方法:
val navController = binding.container.getFragment<NavHostFragment>().navController

关于android - FragmentContainerView 使用 findNavController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67539037/

相关文章:

java - BottomNavigationView - 如何避免重新创建 fragment 并重用它们

android - 当 Android View 在应用程序中可见时是否会触发任何事件?

android - ImageView 适应高度,自动缩放宽度,保持纵横比

java - 访问自定义 NavigationDrawer 内的项目

android - android 中的按钮 View

android - 后退按钮时 fragment 错误

android - 如何自定义对话框的标题部分

android - 在 fragment 之间传递对象

android - Android中的FFMPEG命令无法执行

android - AppWidget 在模拟器和手机上看起来不同 - 移动查看内容