我正在使用带底部导航的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" />
活动
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)
}
9条答案
按热度按时间r7knjye21#
根据this issue,当使用
FragmentContainerView
时,需要使用findFragmentById()
而不是在onCreate()
中使用findNavController()
来查找NavController
:这是因为
findNavController(R.id.nav_host_fragment)
依赖于已经创建的Fragment视图,而使用FragmentContainerView
时则不是这样(因为它使用了一个FragmentTransaction
来添加NavHostFragment
)。如果您使用的是Fragment 1.4.0或更高版本以及View Binding,则可以通过使用
getFragment()
方法来大大简化此过程:yiytaume2#
替换此行:
与
其中
getNavController()
如下所示:omtl5h9j3#
除了公认的答案之外,还有一个可以使用的小捷径:
此致
egdjgwm84#
添加到您的build.gradle(模块:App)这一行
并在活动中使用
和碎片
pvcm50d15#
我用扩展解决了我的问题:
uxh89sit6#
使用简单的
<fragment>
标记,而不是<androidx.fragment.app.FragmentContainerView>
5ktev3wc7#
@friederbluemle的答案还有一个更简单的方法,Assert检查就足够了。
noj0wjuj8#
答案很简单-
作为导航主机片段
qfe3c7zg9#
我已经将
<androidx.fragment.app.FragmentContainerView>
更改为<fragment>
,它对我很有效。