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
相关产品推荐
相关产品推荐

