安卓无效的颜色状态列表标签渐变

24

我的一个应用程序已经下载了超过5000次,每天有500多个用户活跃,并且突然间我开始在Crashlytics上收到一个奇怪的错误:

Caused by android.content.res.Resources$NotFoundException: File res/drawable-anydpi-v24/ic_tickets.xml from drawable resource ID #0x7f0700b3
       at android.content.res.Resources.loadDrawableForCookie(Resources.java:2748)
       at android.content.res.Resources.loadDrawable(Resources.java:2643)
       at android.content.res.TypedArray.getDrawable(TypedArray.java:870)
       at android.widget.TextView.<init>(TextView.java:921)
       at android.widget.TextView.<init>(TextView.java:703)
       at android.support.v7.widget.AppCompatTextView.<init>(AppCompatTextView.java:76)
       at android.support.v7.widget.AppCompatTextView.<init>(AppCompatTextView.java:72)
       at java.lang.reflect.Constructor.newInstance(Constructor.java)


Caused by android.content.res.Resources$NotFoundException: File res/drawable-anydpi-v24/$ic_tickets__0.xml from color state list resource ID #0x7f070017
       at android.content.res.Resources.loadColorStateListForCookie(Resources.java:2858)
       at android.content.res.Resources.loadColorStateList(Resources.java:2807)
       at android.content.res.TypedArray.getColor(TypedArray.java:439)
       at android.graphics.drawable.VectorDrawable$VFullPath.updateStateFromTypedArray(VectorDrawable.java:1605)
       at android.graphics.drawable.VectorDrawable$VFullPath.inflate(VectorDrawable.java:1584)
       at android.graphics.drawable.VectorDrawable.inflateInternal(VectorDrawable.java:666)
       at android.graphics.drawable.VectorDrawable.inflate(VectorDrawable.java:571)
       at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:1215)
       at android.graphics.drawable.Drawable.createFromXml(Drawable.java:1124)


Caused by org.xmlpull.v1.XmlPullParserException: Binary XML file line #6: invalid color state list tag gradient
       at android.content.res.ColorStateList.createFromXmlInner(ColorStateList.java:217)
       at android.content.res.ColorStateList.createFromXml(ColorStateList.java:201)
       at android.content.res.Resources.loadColorStateListForCookie(Resources.java:2854)
       at android.content.res.Resources.loadColorStateList(Resources.java:2807)
       at android.content.res.TypedArray.getColor(TypedArray.java:439)
       at android.graphics.drawable.VectorDrawable$VFullPath.updateStateFromTypedArray(VectorDrawable.java:1605)

堆栈跟踪比这更长,在Crashlytics上超过500行,我在此粘贴了我认为有用于理解问题的内容。

如果我没弄错的话,它抱怨像是我的某个资源丢失或损坏了;可能是什么原因呢?

但是这个资源在apk中是完好无损的:

<vector android:height="24dp" android:viewportHeight="512"
    android:viewportWidth="512" android:width="24dp"
    xmlns:aapt="http://schemas.android.com/aapt" xmlns:android="http://schemas.android.com/apk/res/android">
    <path android:pathData="M381.845,292.27c0,11.032 -8.943,19.975 -19.975,19.975s-19.975,-8.943 -19.975,-19.975c0,-11.032 8.943,-19.975 19.975,-19.975S381.845,281.238 381.845,292.27zM361.869,332.221c-11.032,0 -19.975,8.943 -19.975,19.975s8.943,19.975 19.975,19.975s19.975,-8.943 19.975,-19.975S372.902,332.221 361.869,332.221zM361.869,392.147c-11.032,0 -19.975,8.943 -19.975,19.975s8.943,19.975 19.975,19.975s19.975,-8.943 19.975,-19.975S372.902,392.147 361.869,392.147zM307.418,136.36c-9.983,4.696 -14.268,16.596 -9.572,26.578c4.696,9.983 16.596,14.268 26.578,9.572c9.983,-4.696 14.268,-16.596 9.572,-26.578C329.3,135.95 317.401,131.664 307.418,136.36zM451.759,352.197c0,22.029 17.922,39.951 39.951,39.951h19.975V512H0.314V392.147H20.29c22.029,0 39.951,-17.922 39.951,-39.951s-17.922,-39.951 -39.951,-39.951H0.314V192.393h0.509l-0.042,-0.089L408.489,0l50.866,108.128l-17.013,8.861c-13.29,6.921 -21.544,20.506 -21.544,35.453c0,22.029 17.922,39.951 39.951,39.951h50.937v119.853H491.71C469.681,312.246 451.759,330.168 451.759,352.197zM94.244,192.393h297.352c-6.822,-11.763 -10.75,-25.403 -10.75,-39.951c0,-23.307 10.023,-44.953 27.021,-59.913l-18.505,-39.335l-81.134,38.269c4.355,9.886 0.068,21.491 -9.762,26.115c-9.818,4.618 -21.473,0.536 -26.323,-9.095L94.244,192.393zM411.808,352.197c0,-37.163 25.503,-68.482 59.926,-77.374v-42.479h-89.889c0,11.032 -8.943,19.975 -19.975,19.975s-19.975,-8.943 -19.975,-19.975H40.265v42.479c34.424,8.891 59.926,40.211 59.926,77.374s-25.503,68.482 -59.926,77.374v42.479h301.629c0,-11.032 8.943,-19.975 19.975,-19.975s19.975,8.943 19.975,19.975h89.889V429.57C437.31,420.678 411.808,389.36 411.808,352.197z">
        <aapt:attr name="android:fillColor">
            <gradient android:endX="256.00745" android:endY="511.99982"
                android:startX="256.00745"
                android:startY="-0.0150070675" android:type="linear">
                <item android:color="#FF2AF598" android:offset="0"/>
                <item android:color="#FF009EFD" android:offset="1"/>
            </gradient>
        </aapt:attr>
    </path>
</vector>

这个drawable是应用程序中一个按钮的非常小而简单的图标,我从图标库中下载了它,在我的所有测试中它都可以正常打开和运行。

第二个奇怪的事情是,在今天的500多个活跃用户中,只有4个使用相同型号的智能手机出现了这种情况:

Device
Brand: LGE
Model: LG K10 LTE
Orientation: Portrait
RAM free: 170.92 MB
Disk free: 574.64 MB
Operating System
Version: 6.0
Orientation: Portrait
Rooted: No
Crash

这款智能手机有什么已知问题吗?受影响的用户应该怎么做才能解决问题?


2
两年后,仍然只在搭载Marshmallow的LG G4上出现这个问题... :) - Mohsen Einhesari
5个回答

40
这是因为您使用了一些在API级别24之前不支持的属性。例如,startX,endX,startY,endY和offset。
Android Marshmallow 6.0是API级别23...
无效的颜色状态列表标记gradient来自于偏移量(offset):
<item android:color="#FF2AF598" android:offset="0"/>
<item android:color="#FF009EFD" android:offset="1"/>

这个问题很可能不是特定于 LG 的,而是特定于 Marshmallow


6
很有趣,因为在我的模拟器和许多其他真实的智能手机上都可以在API 16上运行,但我只在那个特定的手机上遇到了这个问题。我的应用程序minSdkLevel为16,许多用户在23以下使用它没有问题。 - Rafael Lima
3
@RafaelLima实际上,Drawable不应该看起来完全一样,其中一半的属性不被考虑...你可以添加一个没有渐变的drawable-v23 - 或者使用PNGWEBP代替。请参阅文档: https://developer.android.com/reference/android/graphics/drawable/VectorDrawable - Martin Zeitler
我使用Android Studio转换器将SVG文件转换为XML可绘制文件,您知道是否有任何转换器可以在API 23之前使其可移植吗? - Rafael Lima
@RafaelLima 你可以使用支持库将SVG渲染为PNG,以实现向后兼容性(无需手动添加资源,当配置时会在构建时自动完成)。 - Martin Zeitler
谢谢,但愿有一份清晰说明的文档。我在谷歌上搜索了一段时间,但没有找到任何信息,而且Android Studio甚至没有对这些进行警告。 - Vince
解决相关问题的答案:https://dev59.com/6VYN5IYBdhLWcg3wK1fO#47918358 在drawable文件夹中保留PNG格式的图像,将矢量图像放在drawable-v24文件夹中。 - Reejesh

9

ImageView上使用app:srcCompat而不是src

在你的应用build.gradle中写下以下代码:

android.defaultConfig.vectorDrawables.useSupportLibrary = true

defaultConfig {
    ...
    vectorDrawables.useSupportLibrary = true
    ...
}

现在你看到它的工作了。

4
实际问题在于您定义的属性,如android:fillColor,它期望是一个单一值的颜色,而不是像渐变或颜色列表这样的颜色列表。它从API 24开始工作。我的建议是告诉您的设计师为低于24的API创建精确的标志。
请参考以下链接了解更多详细信息: 链接

0

不要使用 .xml 来设置图像资源,而是从您的 Java 代码中以编程方式设置图像资源。


0

在Android API 21-23中,使用矢量图形时遇到了这个问题。通过使用以下代码,现在已经解决了:

app:drawableStartCompat="@drawable/ic_placeholder"

并且通过编程方式:

Drawable img = button.getContext().getResources().getDrawable( R.drawable.ic_brush ); button.setCompoundDrawablesWithIntrinsicBounds( img, null, null, null);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接