xml矢量可绘制资源文件确实存在时,VectorDrawable Resources $ NotFoundException

时间:2019-05-03 09:21:12

标签: android android-vectordrawable

我的应用程序最小SDK为21,因此无需添加

AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);

到Application类,因为它仅低于21(无论如何,我试图添加它都没有结果)。
我的build.gradle配置文件具有

defaultConfig {vectorDrawables.useSupportLibrary = true}

设置且未启用防护/缩小

    debuggable true
    crunchPngs false
    minifyEnabled false
    shrinkResources false

    splits.abi.enable false
    splits.density.enable false

无论如何,我使用AndroidStudio检查了编译后的.apk文件,并确保我的所有矢量可绘制对象确实存在于res / drawable文件夹中,因此它不是proguard / shrinker之类的东西。
我还要提到的是,我在此项目中使用的是androidx而不是support
因此,我尝试了图像设置的所有可能变化:

setImageResource(imgResId);
setImageDrawable(ContextCompat.getDrawable(context, imgResId));
setImageDrawable(AppCompatResources.getDrawable(context, imgResId));
setImageDrawable(VectorDrawableCompat.createFromResource(resources, imgResId));
setImageDrawable(VectorDrawableCompat.create(resources, imgResId, null));
setImageDrawable(ResourcesCompat.getDrawable(resources, imgResId, null));

没有任何结果(实际上,结果始终是应用程序崩溃)。发送真实的Theme而不是null也没有帮助。
这是常见的PagerAdapter,并且矢量可绘制图像在每个页面上都动态设置为对应的ImageView,因此,当您(但不是必须)替换它时,并不是静态xml android:src="@drawable\ic_img"app:srcCompat="@drawable\ic_img"
我还尝试将图像包装到选择器中,例如:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/vector_image" />
</selector>

但没有运气-崩溃报告有所更改,但最终导致相同的异常。
this SO question和我发现的其他任何其他问题也无济于事。
我的矢量可绘制对象正在使用仅从API 24开始起作用的渐变。我正在API 26设备上测试我的应用,但尝试通过在android:fillColor部分添加path并注释渐变部分来替换所有渐变,喜欢:

<path
    android:pathData="M268.177,..."
    android:strokeWidth="1"
    android:fillType="nonZero"
    android:strokeColor="#00000000"
    android:fillColor="#FFEF5E32">
    <!--<aapt:attr name="android:fillColor">-->
        <!--<gradient-->
            <!--android:startY="84.70677"-->
            <!--android:startX="284.02185"-->
            <!--android:endY="70.083954"-->
            <!--android:endX="252.21419"-->
            <!--android:type="linear">-->
            <!--<item android:offset="0" android:color="#FFEF5E32"/>-->
            <!--<item android:offset="1" android:color="#FFF68F32"/>-->
        <!--</gradient>-->
    <!--</aapt:attr>-->
</path>

没有运气...
我意识到将向量导入png / webp很可能会解决此问题,但我想使用向量可绘制对象。

1 个答案:

答案 0 :(得分:0)

当我为渐变部分应用补丁时,我注意到AndroidStudio突出显示了这些渐变部分,说它受API 24支持,而我的项目min API为21。因此,我决定检查其他警告,例如:

  

非常长的矢量路径(1456个字符),这对性能不利。   考虑降低精度,删除次要细节或栅格化   向量。

所以我开始怀疑它是问题的根源,因为在AndroidStudio的构建窗口中给出了一条错误消息(红色文本),指出:

  

字符串太大,无法使用写为   “ STRING_TOO_LARGE”。

但是没有胶合剂或指向这个问题的根源,它只是说明我的项目中某个地方的字符串很长,因此它可以是实例数据库或类似的东西。
最后,我在一个矢量可绘制对象中发现了一个异常-这是一个包含约51k个字符的路径字符串!当然,在导入时没有警告我(将SVG转换为xml,使用AndroidStudio完成)。
删除此路径可以解决崩溃问题,但还会丢失一部分图像。
因此,我使用Sketch分解了一个有问题的路径组,并在导入后产生了19k和24k字符的2条路径,虽然这都不好,但现在可以正常使用了。
顺便说一句,我找不到关于vector / xml的字符串长度限制的任何信息,但是gradle确实在构建时应用了此限制,因此众所周知。

Image displays AndroidStudio warning and compile error

The limit of one xml string length revealed in this SO question,找不到官方文件。