Activity调用findNavController扩展方法获取NavController失败如何解决
报错原因
这是Navigation组件和FragmentContainerView配合使用的已知特性,根源是Activity的findNavController扩展方法的实现逻辑限制:
- Activity层面的
findNavController需要在View树已经完成NavController绑定之后才能正常查找,如果你在ActivityonCreate生命周期阶段调用该方法,此时NavHostFragment还未完成附加流程,FragmentContainerView上还未绑定对应NavController,就会抛出该异常。 - 你手动通过
supportFragmentManager查找NavHostFragment再获取NavController的写法,是直接读取Fragment实例内部已经初始化的属性,不会走View树绑定查找的逻辑,因此可以正常执行。
解决方案
推荐优先选择第一种方案,是官方目前建议的标准写法:
- 继续使用当前可正常运行的获取逻辑,直接从FragmentManager取NavHostFragment实例后获取NavController:
val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment val navController = navHostFragment.navController
- 若要使用
findNavController扩展方法,将调用时机延后到onPostCreate生命周期执行,此时NavController已经完成和FragmentContainerView的绑定:
override fun onPostCreate(savedInstanceState: Bundle?) { super.onPostCreate(savedInstanceState) val navController = findNavController(R.id.nav_host_fragment) // 执行后续导航相关逻辑 }
- 不推荐的兜底方案:将布局中的
androidx.fragment.app.FragmentContainerView替换为普通<fragment>标签,该方法会丢失FragmentContainerView的相关优化,仅作为临时兼容方案使用。
内容的提问来源于stack exchange,提问作者user924
相关产品推荐
相关产品推荐

