Android Studio运行项目onCreate处setContentView报错致应用停止
setContentView方法本身几乎不会出现逻辑错误,崩溃本质是方法执行过程中加载布局资源失败,按以下优先级从高到低排查即可:
首先排查R类导包错误
检查MainActivity文件顶部的import语句,90%的同类问题都是误导入了系统的android.R类,而非自己项目包名下生成的R类。直接删除import android.R行,重新导入对应项目包名的R类即可。同时核对第16行传入的布局id是否正确,确认是你需要加载的目标layout文件对应的id,比如R.layout.activity_main。排查布局XML本身的inflate错误
打开setContentView引用的布局文件,切到Design视图确认是否能正常渲染:- 如果布局内使用了自定义View,必须实现
(Context, AttributeSet)双参数构造方法,缺该方法时XML inflate流程会直接抛异常崩溃 - 检查控件类名是否拼写正确,是否存在AndroidX和旧Support库混用的问题:比如项目依赖AndroidX库却引用了旧Support库的控件全类名,会直接报类找不到错误
- 如果使用了Material Design系列控件,确认App主题继承自
Theme.MaterialComponents系列,否则inflate Material控件时会抛出类型不匹配异常
- 如果布局内使用了自定义View,必须实现
排除增量编译导致的资源错乱
依次点击菜单栏的Build -> Clean Project,等待执行完成后再点击Build -> Rebuild Project,清除之前编译产生的缓存文件,解决增量编译导致的R类id映射错误、资源未正确打包的问题。如果Rebuild阶段控制台已经报出资源相关的编译错误,先修复编译阶段的资源问题再运行项目。拿准确堆栈定位根因
IDE高亮的行号只是崩溃触发的位置,不是根本原因。打开Logcat面板过滤FATAL级别的日志,找到Caused by:开头的核心报错行:- 报
Resources.NotFoundException:对应资源不存在,回到前两个步骤核对资源引用、布局文件 - 报
InflateException:看异常后拼接的具体控件类名和错误信息,对应修复布局内的问题控件即可 - 报主题/类型不匹配错误:核对应用主题和所用控件的依赖要求
- 报
快速验证技巧:临时把setContentView的入参换成系统自带的简单布局
android.R.layout.simple_list_item_1,如果替换后app可以正常启动不崩溃,就能100%确认问题出在你自己的布局引用/布局文件本身,和Activity其他代码无关。
内容的提问来源于stack exchange,提问作者Ahmed Dir

