AppCompat 23.3支持向量不再起作用?

时间:2016-04-07 18:49:14

标签: android android-appcompat android-vectordrawable

我正在使用Support Library 23.2中添加的支持向量drawable和AppCompat。我使用app:srcCompatStateListDrawable内的矢量绘图,因此我可以将android:drawableLeft用于我的TextView。

自升级到AppCompat的23.3.0版本以来,只有app:srcCompat中的向量正在运行。每当我以其他方式引用它时

FATAL EXCEPTION: main
 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.my.package.name/.MainActivity}: android.view.InflateException: Binary XML file line #8: Error inflating class Button
 ...
 Caused by: android.view.InflateException: Binary XML file line #8: Error inflating class Button
 ...
 Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line #14: invalid drawable tag vector
  at android.graphics.d

现在改变了什么导致我的支持向量drawables在某些情况下失败了?

3 个答案:

答案 0 :(得分:40)

更新:他们在支持库23中再次启用它:

  

对于AppCompat用户,我们添加了一个选择性API,通过AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)重新启用资源支持Vector Drawables(23.2中的行为); - 请记住,这仍然会导致内存使用问题和更新配置实例的问题,因此默认情况下会禁用它。

检查this link: 23.4.0 available now
-------------------------------------------------- ---------

根据release announcement for Android Support Library 23.3

  

对于AppCompat用户,由于版本23.2.0 / 23.2.1 [https://code.google.com/p/android/issues/detail?id=205236中的实现中发现的问题,我们决定删除允许您使用Lollipop前设备上的资源使用矢量绘图的功能。 ,https://code.google.com/p/android/issues/detail?id=204708]。使用app:srcCompatsetImageResource()继续有效。

所以这是预期的行为改变。对于srcCompat未处理的任何案例,您必须使用非矢量图形。

如果您希望在API 21之前继续使用向量,可以删除该行

vectorDrawables.useSupportLibrary = true

(如果您使用23.2 blog post中显示的1.5 Gradle插件,则相当于。)

这将导致Android Studio在编译时为API 21以上设备上的向量使用minSdkVersion低于API 21的应用生成PNG,允许您保留与23.2.1相同的代码,但代价是额外的APK大小。

答案 1 :(得分:16)

支持库23.2.0中添加了对前Lollipop的VectorDrawable支持,然后在23.3.0中部分删除。在23.4.0及更高版本(至少25.1.0)中,删除的部分返回但在可选标志后面(因为它带有价格)。

总结:在支持库23.4.0中至少25.1.0,您可以让VectorDrawable在某些情况下

我已this diagram提供帮助。

VectorDrawable cheatsheet

答案 2 :(得分:4)

使用vector作为compoundDrawables(例如textview)而不使用

AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);

导致记录的高内存使用率,只需使用

对文件进行充气
Drawable drawable = AppCompatResources.getDrawable( getContext(), R.drawable.vector_resID );
if( drawable != null ) drawable.setBounds( 0, 0, iconSize, iconSize );
TextViewCompat.setCompoundDrawablesRelative( textView, null, null, drawable, null);

这是navDrawer的工作方式