使用VectorDrawableCompat加载Drawable时崩溃问题求助
解决VectorDrawableCompat加载崩溃的Resources$NotFoundException问题
先来看你遇到的具体场景和错误信息:
触发崩溃的代码:
Drawable drawable = VectorDrawableCompat.create(getResources(), R.drawable.ic_group_tip, null);崩溃堆栈信息:
进程:com.microsoft.mobile.polymer.dev1,PID:16061 android.content.res.Resources$NotFoundException:来自颜色状态列表资源ID #0x7f020446的文件res/drawable-v22/ic_group_tip_1.xml at android.content.res.Resources.loadColorStateListForCookie(Resources.java:3056) at android.content.res.Resources.loadColorStateList(Res...
这个问题的核心是矢量图文件里引用的颜色状态列表资源在目标系统版本(v22)下无法被找到,或是矢量图的低版本兼容配置没到位,给你几个实用的排查和解决方向:
检查矢量图中的颜色引用合法性
打开res/drawable-v22/ic_group_tip_1.xml文件,找到里面用到的颜色属性(比如android:fillColor="@color/xxx_color_state"),确认对应的@color/xxx_color_state是否存在:- 如果这个颜色状态列表是定义在
res/color-v23/或更高版本的目录下,v22设备自然访问不到,需要把它移到通用的res/color/目录中。 - 也可能是颜色资源的ID写错了,或者XML文件本身有语法错误(比如标签未闭合),可以用Android Studio的XML验证工具快速检查。
- 如果这个颜色状态列表是定义在
完善VectorDrawable的低版本兼容配置
确保你的项目已经正确开启矢量图兼容:- 在Module级的
build.gradle中添加配置:android { defaultConfig { vectorDrawables.useSupportLibrary = true } } - 如果你的Activity继承自
AppCompatActivity,可以在onCreate方法中添加一行代码,强制开启矢量图兼容:@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); // 其他初始化代码 }
- 在Module级的
清理编译缓存并重建项目
有时候资源ID会因为编译缓存出现冲突或错误,尝试执行:- Android Studio顶部菜单
Build > Clean Project - 接着执行
Build > Rebuild Project
这样能重新生成所有资源ID,避免缓存导致的资源找不到问题。
- Android Studio顶部菜单
修正VectorDrawableCompat的调用参数
你当前调用create方法时第三个参数传了null,如果你的矢量图用到了主题相关的颜色属性,建议传入当前Activity的Theme,而不是null:Drawable drawable = VectorDrawableCompat.create(getResources(), R.drawable.ic_group_tip, getTheme());这样能确保矢量图正确加载主题关联的颜色资源。
内容的提问来源于stack exchange,提问作者Anish Singh
相关产品推荐
相关产品推荐

