我面临与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?
速览:
最佳答案
自从我问了这个问题以来,有些事情已经改变了,所以我自己回答。
使用支持库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,然后将更深入地探讨该主题。