Android 9下BottomNavigationView销毁Activity时NavController缺失崩溃
该崩溃仅出现于 Android 9 设备,堆栈指向 NavHostFragment.onDestroyView 方法中无法找到绑定的 NavController。结合你提供的多底部导航栏管理代码,核心原因是 Android 9 的 Fragment 生命周期回调逻辑与高版本存在差异:当 Activity 销毁时,已被 detach 的 NavHostFragment 仍会触发 onDestroyView,但此时视图已与 NavController 解绑,框架调用 Navigation.findNavController 时抛出异常。
以下是针对性修复方案:
方案1:自定义 NavHostFragment 捕获异常
创建自定义 NavHostFragment,覆盖 onDestroyView 方法捕获该异常(销毁阶段的异常不影响功能,仅避免崩溃):
class SafeNavHostFragment : NavHostFragment() { override fun onDestroyView() { try { super.onDestroyView() } catch (e: IllegalStateException) { // 捕获 Android 9 下的 NavController 未找到异常 e.printStackTrace() } } }
修改 NavigationExtensions.kt 中 obtainNavHostFragment 方法的实例创建逻辑:
// 替换原 NavHostFragment.create(navGraphId) 为自定义实现 val navHostFragment = SafeNavHostFragment.create(navGraphId)
方案2:升级 Navigation 组件版本
检查项目中 Navigation 依赖版本,升级至 androidx.navigation:navigation-fragment-ktx:2.5.3 或更高稳定版。新版本已修复部分 Android 9 下的生命周期兼容问题,从框架层面解决该崩溃。
方案3:优化 NavHostFragment 的 detach 逻辑
在 detach NavHostFragment 前,主动解除 NavController 与视图的关联,避免后续销毁时触发异常:
private fun detachNavHostFragment( fragmentManager: FragmentManager, navHostFragment: NavHostFragment ) { // 尝试解除 NavController 与视图的绑定 runCatching { Navigation.findNavController(navHostFragment.requireView()) }.onSuccess { navController -> navController.setViewModelStore(null) } fragmentManager.beginTransaction() .detach(navHostFragment) .commitNow() }
内容的提问来源于stack exchange,提问作者Human
相关产品推荐
相关产品推荐

