无效的可绘制标记向量 - appcompat-v7:24.1.1

4

我已经阅读了类似问题的大部分答案,但没有一个能解决我的问题

Gradle classpath 'com.android.tools.build:gradle:2.1.2'

android {
   defaultConfig {
      minSdkVersion 16
      targetSdkVersion 24
      vectorDrawables.useSupportLibrary = true
   }
}

dependencies {
    compile 'com.android.support:recyclerview-v7:24.1.1'
    compile 'com.android.support:appcompat-v7:24.1.1'
    compile 'com.android.support:cardview-v7:24.1.1'
    compile 'com.android.support:support-v4:24.1.1'
    compile 'com.android.support:design:24.1.1'
}

activity.xml

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/ScrollView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ViewItem"
    tools:ignore="MissingPrefix">

    ...

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_column="0"
        android:layout_gravity="center_vertical"
        android:layout_marginBottom="10dp"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
        android:layout_marginTop="10dp"
        android:foregroundGravity="center_vertical|center|center_horizontal"
        app:srcCompat="@drawable/ic_car" />

    ...

</ScrollView>

向量图 ic_car.xml

<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportHeight="24"
    android:viewportWidth="24">

    <path
        android:fillColor="#5c5c5c"
        android:pathData="M18.92 6.01C18.72 5.42 18.16 5 17.5 5h-11c-.66 0-1.21 .42 -1.42 1.01L3 12v8c0
.55 .45 1 1 1h1c.55 0 1-.45 1-1v-1h12v1c0 .55 .45 1 1 1h1c.55 0 1-.45
1-1v-8l-2.08-5.99zM6.5 16c-.83 0-1.5-.67-1.5-1.5S5.67 13 6.5 13s1.5 .67 1.5
1.5S7.33 16 6.5 16zm11 0c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5 .67 1.5
1.5-.67 1.5-1.5 1.5zM5 11l1.5-4.5h11L19 11H5z" />
    <path android:pathData="M0 0h24v24H0z" />
</vector>

我的活动类扩展AppCompatActivity,所有的android:src标签都被改为app:srcCompat,但仍然在设置为16minSdkVersion上看到Invalid drawable tag vector错误。


你尝试使用android:src而不是app:srcCompat了吗? - Muddassir Ahmed
@MuddassirAhmed 当然,我做了。 - PYPL
这只发生在发布版本中,还是所有版本中都会出现? - lionscribe
如Zeke所说,@lionscribe在所有版本中。 - PYPL
4个回答

2
在我的情况下,崩溃是由于在低于Android 5.0的设备上使用Resources.getDrawable(int)获取矢量图而导致的。我试图创建一个可绘制对象来传递给ImageView.setImageDrawable(Drawable)Google Android支持库23.2博客文章:

从Android支持库23.3.0开始,支持矢量图仅能通过app:srcCompat或setImageResource()加载。

解决方法:使用VectorDrawableCompat.create(Resources, int, Theme)来创建可绘制对象。
您也可以使用ImageView.setImageResource(int),但这将在UI线程上读取/解码位图。

1

事实上,从您的代码来看,只要使用srcCompat属性,它应该可以在库的任何版本中工作。
我怀疑的一个问题是,您的向量位于drawable-21文件夹中,而在常规Drawable文件夹中,您只有一个引用这些可绘制对象的单个文件。这是早期库版本中使用的方法,但由于以下更改不再起作用。只需将实际的矢量文件移动到Drawable文件夹即可。
我们曾经遇到过类似的问题,通过将ImageView更改为AppCompatImageView解决。尽管库应该自动执行此操作,但有时似乎并没有。
如果您的矢量图是复合图像的一部分,例如分层图像,则仍然可能会导致代码中断。或者在您未发布代码的其他位置中断,例如如果您将矢量图设置为ImageButton上的leftImage。这些功能已在23.3中删除,如@Zeke所回答的那样。尽管如此,它在23.4中返回,并通过将以下内容添加到活动中使其可用。

static {
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}

他们仍然警告你可能会导致内存泄漏。请参见https://medium.com/@chrisbanes/appcompat-v23-2-age-of-the-vectors-91cbafa87c88#。,但对于最小使用,这不应该是一个问题。
一个简单的解决方法是在代码中创建Drawable并设置它。像这样;
Drawable icon = AppCompatDrawableManager.get().getDrawable(context, resVectorID);  
// Set it for example as a left image of button
button.setCompoundDrawablesWithIntrinsicBounds( icon, null, null, null );

我没有测试过这个,也不知道是否会导致内存问题。如果有人能跟进,那就太好了。

需要做三件事: 1)在gradle上设置vectorDrawables.useSupportLibrary = true; 2)在Activity中使用static { AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); }来渲染SVG; 3)在ImageView中使用app:srcCompat代替android:src; 如果缺少其中任何一个,您的应用程序将会崩溃 - 截至24.2.0版本。 - Saravanabalagi Ramachandran

0

在更新到Android Studio 2.2之后,问题自行解决了。


0
我是这样做的:
public static final Drawable getMyDrawable(Context context, int id) {
     final int version = Build.VERSION.SDK_INT;
     if (version >= 21) {
         return ContextCompat.getDrawable(context, id);
     } else {
         return VectorDrawableCompat.create(context.getResources(), id,  context.getTheme());
     }
}

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