You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 9下BottomNavigationView销毁Activity时NavController缺失崩溃

Android 9 下 NavHostFragment 销毁时的 IllegalStateException 修复

该崩溃仅出现于 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 19:30:55