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

SDK<21设备使用矢量Drawable报错:XML加载类失败求助

解决Pre-Lollipop设备上矢量Drawable布局加载异常问题

从你提供的异常日志能明确看出,核心问题是API 21以下的安卓设备不支持原生加载矢量Drawable,具体表现为Resources$NotFoundException无法找到res/drawable/ic_share_black_24dp.xml这个矢量资源。结合你的项目配置,给你几个针对性的解决方案:

方案1:用AppCompat兼容属性替换原生属性加载矢量图

在布局XML里,把引用该矢量图的android:src替换为app:srcCompat,同时确保你的Activity继承自AppCompatActivity,且应用主题是AppCompat系列(比如Theme.AppCompat.Light)。

举个修改示例:
原ImageView代码:

<ImageView
    android:id="@+id/share_btn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_share_black_24dp"/>

修改后:

<ImageView
    android:id="@+id/share_btn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:srcCompat="@drawable/ic_share_black_24dp"/>

注意:必须在布局根标签添加AppCompat命名空间:

xmlns:app="http://schemas.android.com/apk/res-auto"

方案2:在Build配置中启用矢量Drawable全局兼容

在app/build.gradle的defaultConfig块中添加配置,让Gradle自动为低版本设备生成矢量图对应的兼容PNG资源:

android {
    defaultConfig {
        // 保留你原有的其他配置
        vectorDrawables.useSupportLibrary = true
    }
}

你的Android Gradle插件版本是3.1.2,这个配置完全适配,能自动处理API<21设备的矢量图兼容问题。

方案3:代码中手动兼容加载矢量图

如果是在代码里动态设置矢量Drawable(比如Fragment的onCreateView中),可以用DrawableCompat做兼容处理:

import android.support.v4.content.res.DrawableCompat;

// 加载并兼容矢量Drawable
Drawable shareDrawable = DrawableCompat.create(getResources(), R.drawable.ic_share_black_24dp, getTheme());
yourImageView.setImageDrawable(shareDrawable);

额外注意事项

  • 你当前的appcompat-v7:27.1.1和compileSdkVersion 27版本匹配,这部分无需调整;
  • 如果该矢量图被用在selector这类Drawable容器中,同样要改用app:srcCompat引用,或者在代码中通过DrawableCompat处理后再设置。

按照上述方案处理后,API<21的设备就能正常加载这个矢量Drawable了。

内容的提问来源于stack exchange,提问作者Marius

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:28:12