AppCompat 23.3支持的矢量图不再起作用?

34
我正在使用Support Library 23.2中添加的支持向量可绘制对象,以及AppCompat。我同时在app:srcCompat中和StateListDrawable内使用向量可绘制对象,以便在TextView中使用android:drawableLeft
自从升级到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

是什么导致了我的支持向量可绘制对象在某些情况下失败?


最后我还是不明白。如果我想使用向量图,只需删除vectorDrawables.useSupportLibrary = true并使用app:srcCompat或普通的android:src吗? - Mahdi
请查看我的答案:https://dev59.com/eVoU5IYBdhLWcg3wTVkd#37864531 - Rich Luick
3个回答

43

更新:在Support Library 23中,他们重新启用了它:

对于使用AppCompat的用户,我们添加了一个选择性API来通过AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)重新启用支持从资源加载矢量图(在23.2中找到的行为);请注意,默认情况下此功能仍可能导致内存使用问题和配置实例更新问题。

请查看此链接:23.4.0现已提供
-----------------------------------------------------------

根据Android Support Library 23.3发布公告

对于使用AppCompat的用户,由于在版本23.2.0 / 23.2.1中发现的问题,我们决定删除使您可以在Lollipop以下设备上使用资源矢量图形的功能。[https://code.google.com/p/android/issues/detail?id=205236,https://code.google.com/p/android/issues/detail?id=204708]。继续使用app:srcCompatsetImageResource()可正常工作。

因此,这是一种预期的行为更改。对于任何未由srcCompat处理的情况,您将必须使用非矢量图形。

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

vectorDrawables.useSupportLibrary = true

(如果您使用 1.5 Gradle 插件,则相应地进行设置,如23.2 博客文章中所示。)

这将导致在编译时生成 PNG 文件,以便用于最低支持 API 版本小于 21 的应用程序,并在 API 版本为 21 及以上的设备上使用矢量图像,从而使您保持与 23.2.1 相同的代码,但会增加 APK 文件大小。


1
我可以在Android Gradle插件2.0.0中使用它吗? - Arnav M.
@ArnavM。Gradle插件的版本不会改变任何东西(只会影响您如何启用支持矢量可绘制图形)。 - ianhanniballake
所以基本上app:srcCompat现在已经没有用处了,因为如果我们禁用矢量可绘制支持库,最终所有矢量都会变成PNG。那么"drawableStart/drawableEnd/等等"的所有好处现在都没有了,而且由于这种导致应用程序崩溃的回归,似乎不可能在XML布局中混合矢量和非矢量资产。 - Adrian Crețu
4
如果你只是在使用支持向量进行srcCompat或者在运行时使用VectorDrawableCompat.create(),那么你可以继续在Lollipop之前使用支持向量。有一种数据绑定技巧旨在通过在幕后使用VectorDrawableCompat.create()来恢复此功能。 - ianhanniballake
1
@Kenji:如果你已经移除了useSupportLibrary,那么你也不需要srcCompat。直接使用src即可。 - ianhanniballake
显示剩余10条评论

18

在支持库23.2.0中添加了对Lollipop之前版本的VectorDrawable支持,然后在23.3.0中部分移除。在23.4.0及以上版本(至少25.1.0),已经将移除的部分恢复,但在可选标志后面(因为它的使用是有代价的)。

总之:在支持库23.4.0至少25.1.0期间,你可以使VectorDrawable在某些情况下工作

我制作了这张图表来帮助理解。

VectorDrawable cheatsheet


2
那是一个很棒的图表 :) - Daniel Wilson

5

可以在不使用Java代码的情况下将向量作为compoundDrawables(例如文本视图)使用:

AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);

导致内存使用率高的问题已经有记录,只需要使用inflate函数来扩展向量即可。
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);

这是导航抽屉运作的方式。

你也可以使用 TextViewCompat.setCompoundDrawablesRelativeWithIntrinsicBounds(),这样就不需要自己设置边界了。 - ubuntudroid

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