我面临与VectorDrawables的新向后兼容性的问题。
支持库23.2中提供了一项新功能,用于与向后兼容的Android VectorDrawables引入。

我有一个ImageView,这是分配给它的SelectorDrawable。这个Drawable拥有几个VectorDrawables,所以我认为我应该使用app:srcCompat来实现兼容性。但它不适用于带有Android 4.1.2的Galaxy S2。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/ic_gps_fixed_24dp"android:state_activated="true" android:state_selected="true"></item>
    <item android:drawable="@drawable/ic_gps_not_fixed_24dp" android:state_activated="true" android:state_selected="false"></item>
    <item android:drawable="@drawable/ic_gps_not_fixed_24dp" android:state_activated="false" android:state_selected="true"></item>
    <item android:drawable="@drawable/ic_gps_off_24dp" android:state_activated="false" android:state_selected="false"></item>
    <item android:drawable="@drawable/ic_gps_not_fixed_24dp"></item>
</selector>

所有可绘制对象都是矢量xml文件。

当将此SelectorDrawable与srcCompat一起使用时,出现此错误:
  Caused by: android.content.res.Resources$NotFoundException: File res/drawable/  Caused by: android.content.res.Resources$NotFoundException: File res/drawable/ic_gps_fixed_24dp.xml from drawable resource ID #0x7f0201c1
                                                                           at android.content.res.Resources.loadDrawable(Resources.java:1951)
                                                                           at android.content.res.Resources.getDrawable(Resources.java:672)
                                                                           at android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:173)
                                                                           at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:881).xml from drawable resource ID #0x7f0201c1

使用android:src甚至更糟。

如果我将矢量可绘制对象之一与app:srcCompat一起使用,则一切正常。所以我想这与SelectorDrawable和兼容性有关。

是否有人遇到过同样的问题并找到了解决方案,或者当前无法在Android 5之前的SelectorDrawables中使用VectorDrawables?

速览:
  • 编译目标API 23
  • 支持Libraray 23.3.0
  • vectorDrawables.useSupportLibrary = true
  • Gradle 2.0
  • 最佳答案

    自从我问了这个问题以来,有些事情已经改变了,所以我自己回答。

    使用支持库23.4.0,重新启用了对Ressources中VectorDrawables的支持:Android Support Library 23.4.0 available now

    您可以在Google I/O 2016的此类型转换中找到有关此信息的更多信息:
    What's new in the support library - Google I/O 2016

    您需要将其添加到要在Android 5.0以下版本(代码名Lollipop,API级别21)上的设备上使用VectorDrawables的每个Activity中:

    static {
        AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
    }
    

    因此,您现在可以在DrawableContainers中使用VectorDrawables,但它仍可能会导致某些问题,如上面的源中所述,因此请谨慎使用。

    到目前为止,我还没有在应用程序中重新启用此功能,但是在下一个主要版本中,我会将很多图标更改为VectorDrawables,然后将更深入地探讨该主题。

    09-11 17:18