Android矢量资源(Vector Asset)在API23设备无法显示的解决咨询
我之前也碰到过一模一样的情况——明明开了vectorDrawables.useSupportLibrary = true,API27能正常显示,API23却直接空白。试试下面这几个排查步骤,大概率能解决:
替换布局中的
android:src为app:srcCompat
低版本系统没法通过原生android:src正确解析矢量图,必须用support库提供的app:srcCompat属性。记得先在布局根节点添加命名空间:xmlns:app="http://schemas.android.com/apk/res-auto"然后修改ImageView的引用方式:
<ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" app:srcCompat="@drawable/your_vector_icon" />全局开启矢量图兼容开关
在你的Application类的onCreate()方法里加一行代码,确保整个App都能正确识别矢量资源:@Override public void onCreate() { super.onCreate(); AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); }要是没自定义Application,也可以在每个用到矢量图的Activity里加,但全局配置更省心。
补全build.gradle的兼容配置
除了vectorDrawables.useSupportLibrary = true,如果你的Android Gradle Plugin版本低于3.0,还得加个aapt参数禁用矢量图的版本标记:android { defaultConfig { vectorDrawables.useSupportLibrary = true } aaptOptions { additionalParameters "--no-version-vectors" } }另外建议把
compileSdkVersion和targetSdkVersion升到28以上,更高的版本对矢量图兼容性更完善。检查矢量图代码的语法细节
看你贴的矢量图代码,android:strokeWidth = "1"这里有多余空格,虽然XML语法允许,但低版本解析器可能对这种格式敏感。建议改成:android:strokeWidth="1"也可以用Android Studio的Vector Asset工具重新导出一遍图标,确保pathData里的路径命令都是兼容低版本的标准格式。
代码中加载时用ContextCompat
如果是动态设置图标,别用getResources().getDrawable(),改用ContextCompat.getDrawable():imageView.setImageDrawable(ContextCompat.getDrawable(this, R.drawable.your_vector_icon));或者直接用AppCompatImageView替代原生ImageView,它对矢量图的支持更友好。
按这个顺序排查下来,应该就能解决API23上的显示问题了。
内容的提问来源于stack exchange,提问作者porthfind

