34

我正在使用支持库 23.2中添加的支持向量可绘制对象以及 AppCompat。app:srcCompat我在 a 和 a 内都使用了矢量可绘制对象,StateListDrawable因此我可以将它们与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

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

4

3 回答 3

43

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

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

检查此链接: 23.4.0 现在可用
----------------------------- ------------------

根据Android 支持库 23.3 的发布公告

对于 AppCompat 用户,由于版本 23.2.0/23.2.1 [ https://code.google.com com/p/android/issues/detail?id=205236https://code.google.com/p/android/issues/detail ?id=204708 ]。使用app:srcCompatsetImageResource()继续工作。

所以这是一个预期的行为变化。对于任何未处理的情况,您都必须使用非矢量图形srcCompat

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

vectorDrawables.useSupportLibrary = true

(或者如果您使用23.2 博客文章中所示的 1.5 Gradle 插件,则等效)。

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

于 2016-04-07T18:49:13.970 回答
18

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

综上所述:在支持库 23.4.0 到至少 25.1.0 中,你可以让 VectorDrawable在某些情况下工作。

我已经制作了这张图来提供帮助。

VectorDrawable 备忘单

于 2017-01-25T17:20:36.413 回答
5

将向量用作 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 的工作方式

于 2016-10-21T09:55:02.887 回答