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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 19:53:12