App闪屏后HomeActivity因Fragment膨胀失败崩溃求助
解决HomeActivity启动时Fragment Inflate崩溃问题
崩溃日志
FATAL EXCEPTION: main Process: com.tapz.app, PID: 27735 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.tapz.app/com.tapz.app.ui.HomeActivity}: android.view.InflateException: Binary XML file line #21 in com.tapz.app:layout/activity_home: Binary XML file line #21 in com.tapz.app:layout/activity_home: Error inflating class fragment
核心排查方向与解决方案
1. 检查导航图配置
- 打开
res/navigation/mobile_navigation.xml,确认三个目标Fragment(navigation_home、navigation_dashboard、navigation_settings)的id与bottom_nav_menu.xml中的item id完全匹配 - 验证每个Fragment的
name属性指向正确的类路径,例如com.tapz.app.ui.home.HomeFragment - 确保导航图根标签
navigation设置了正确的默认启动目标:app:startDestination="@id/navigation_home"
2. 修复NavHostFragment初始化逻辑
AndroidX Navigation在API 28及以下版本中,直接调用findNavController可能导致初始化异常,改用FragmentManager获取:
// 替换原有的findNavController代码 val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment_activity_home) as NavHostFragment val navController = navHostFragment.navController
3. 确保Fragment添加Hilt注解
由于HomeActivity使用了@AndroidEntryPoint,所有被托管的Fragment必须同样添加该注解才能正常使用Hilt依赖,示例:
@AndroidEntryPoint class HomeFragment : Fragment() { // ... }
4. 替换底部导航的手动监听逻辑
手动设置setOnNavigationItemSelectedListener容易引发重复导航或栈异常,改用Navigation组件自带的绑定方法:
// 配置AppBar,避免返回按钮异常 val appBarConfiguration = AppBarConfiguration( setOf( R.id.navigation_home, R.id.navigation_dashboard, R.id.navigation_settings ) ) setupActionBarWithNavController(navController, appBarConfiguration) // 绑定底部导航与导航控制器 navView.setupWithNavController(navController)
5. 检查布局资源引用
- 确认
@drawable/chip_nav_item_bg、@drawable/menu_item_background、@style/BottomNavigationTextStyle等资源存在且无语法错误 - 检查
@menu/bottom_nav_menu中的每个item的id与导航图中Fragment的id完全一致(大小写敏感)
6. 清理重建项目
执行Build -> Clean Project,再执行Build -> Rebuild Project,清除编译缓存,解决资源编译异常问题
修改后的HomeActivity代码示例
package com.tapz.app.ui import android.os.Bundle import com.google.android.material.bottomnavigation.BottomNavigationView import androidx.appcompat.app.AppCompatActivity import androidx.navigation.fragment.NavHostFragment import androidx.navigation.ui.AppBarConfiguration import androidx.navigation.ui.setupActionBarWithNavController import androidx.navigation.ui.setupWithNavController import com.tapz.app.R import com.tapz.app.databinding.ActivityHomeBinding import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint class HomeActivity : AppCompatActivity() { private lateinit var binding: ActivityHomeBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityHomeBinding.inflate(layoutInflater) setContentView(binding.root) val navView: BottomNavigationView = binding.navView // 正确获取NavHostFragment与导航控制器 val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment_activity_home) as NavHostFragment val navController = navHostFragment.navController // 配置AppBar与底部导航 val appBarConfiguration = AppBarConfiguration( setOf( R.id.navigation_home, R.id.navigation_dashboard, R.id.navigation_settings ) ) setupActionBarWithNavController(navController, appBarConfiguration) navView.setupWithNavController(navController) } }
内容的提问来源于stack exchange,提问作者Sahar Batool
相关产品推荐
相关产品推荐

