Android 6.0设备setContentView触发Resources$NotFoundException崩溃修复咨询
Android 6.0 setContentView崩溃的修复与规避方案
从你提供的堆栈信息来看,这个崩溃的核心原因非常明确:Android 6.0设备在加载Button的StateListDrawable状态选择器时,触发了Resources$NotFoundException,最终导致布局解析失败。接下来我们拆解问题并给出具体解决方案:
一、精准定位问题诱因
从堆栈最底层的org.xmlpull.v1.XmlPullParserException和Resources$NotFoundException可以推断,问题出在你给Button设置的自定义状态选择器(比如btn_selector.xml这类文件)上,常见诱因包括:
- 选择器里引用了Android 6.0(API 23)不支持的资源类型,比如直接在xml里引用VectorDrawable(原生6.0不支持selector嵌套VectorDrawable);
- 选择器中引用的drawable资源缺失,比如只在高分辨率文件夹(如xxhdpi)存放了资源,低分辨率设备(如mdpi)对应的文件夹下没有备份;
- 资源混淆工具(如AndResGuard)误删或重命名了选择器依赖的drawable资源。
二、具体修复/规避方案
1. 修复VectorDrawable兼容性问题
如果你的选择器里用了VectorDrawable,这是6.0设备最常见的触发场景:
- 首先确保项目引入了AppCompat库,然后在
build.gradle(Module级别)中添加VectorDrawable兼容配置:android { defaultConfig { vectorDrawables.useSupportLibrary = true } } - 布局中使用
AppCompatButton替代原生Button,并通过app:srcCompat引用VectorDrawable;或者直接把VectorDrawable导出为PNG图片,放到对应密度文件夹下。
2. 补全缺失的资源文件
- 打开你的状态选择器xml文件(通常在
res/drawable/目录下),逐一检查所有android:drawable属性的引用,确保每个引用的资源都存在; - 建议至少在
res/drawable/目录下保留一份通用版本的资源,避免不同密度设备出现资源缺失。
3. 调整资源混淆规则
如果项目开启了资源混淆:
- 检查混淆配置文件,确保状态选择器依赖的所有drawable资源没有被误删;
- 添加保留规则,比如要保留所有按钮相关的drawable:
<!-- AndResGuard 示例规则 --> <keep resources="@drawable/btn_*"/>
4. 临时规避:改用兼容Button样式
如果以上方案暂时无法落地,可以快速规避崩溃:
- 布局中使用
AppCompatButton替代原生Button,它自带更好的低版本兼容性; - 或者暂时放弃自定义样式,使用系统默认Button样式:
<Button android:id="@+id/my_btn" android:layout_width="wrap_content" android:layout_height="wrap_content" style="@android:style/Widget.Button" android:text="确认"/>
内容的提问来源于stack exchange,提问作者activity
相关产品推荐
相关产品推荐

