Android API 21应用因Vector Assets崩溃问题求助
兄弟,我之前也踩过一模一样的坑!明明官方说Vector Asset支持API21+,结果在Android5.0设备上一用就崩,错误就是你贴的android.view.InflateException: Binary XML file line #26: Error inflating class ImageView。其实这是API21原生VectorDrawable的兼容性漏洞,下面给你一步步搞定:
核心原因
API21虽然名义上支持VectorDrawable,但系统原生的实现存在不少缺陷,直接在XML里引用矢量图时,系统无法正确解析渲染。而AppCompat库提供的VectorDrawableCompat可以完美兼容低版本,但需要我们手动开启这个兼容机制。
具体解决方案
1. 配置Gradle启用矢量图兼容支持
打开你的Module级别build.gradle文件,在defaultConfig块里添加兼容配置,同时确保依赖了AppCompat库:
android { defaultConfig { // 启用VectorDrawableCompat兼容支持 vectorDrawables.useSupportLibrary = true } } dependencies { // 建议使用AndroidX版本的AppCompat implementation 'androidx.appcompat:appcompat:1.6.1' // 如果你还在用旧Support库,替换成这个: // implementation 'com.android.support:appcompat-v7:28.0.0' }
2. XML布局里用app:srcCompat替代android:src
在布局文件中引用矢量图时,不要用android:src,改用app:srcCompat,同时要确保布局根元素声明了app命名空间:
<!-- 根元素添加app命名空间 --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" ...> <ImageView android:id="@+id/icon_view" android:layout_width="wrap_content" android:layout_height="wrap_content" <!-- 用app:srcCompat引用矢量图 --> app:srcCompat="@drawable/your_vector_icon" /> </LinearLayout>
3. 代码中设置矢量图的正确方式
如果需要在代码里动态设置矢量图,不要用setImageResource(),而是用AppCompatResources.getDrawable()获取兼容的Drawable:
// Java示例 ImageView iconView = findViewById(R.id.icon_view); Drawable vectorDrawable = AppCompatResources.getDrawable(this, R.drawable.your_vector_icon); iconView.setImageDrawable(vectorDrawable);
// Kotlin示例 val iconView = findViewById<ImageView>(R.id.icon_view) val vectorDrawable = AppCompatResources.getDrawable(this, R.drawable.your_vector_icon) iconView.setImageDrawable(vectorDrawable)
4. 排查复杂SVG的兼容问题
如果上面的步骤还没解决,可能是你转换的SVG本身带有API21不支持的属性:
- 打开生成的矢量图XML文件(
res/drawable目录下),检查<path>标签的android:fillType属性,如果是evenOdd,改成nonZero试试,API21对evenOdd的支持不稳定。 - 用Vector Asset工具重新转换SVG,选择本地文件时,尽量简化SVG的路径和样式,避免过于复杂的图形指令。
验证测试
做完以上配置后,重新打包安装到API21设备上,应该就能正常加载矢量图,不会再出现InflateException崩溃了。
内容的提问来源于stack exchange,提问作者Arman Ramezanzadeh

