无效的可绘制标签向量

Invalid drawable tag vector

我正在尝试在棒棒糖之前的设备上使用矢量绘图。我按照指示 here 进行了所有操作,但我仍然遇到此崩溃。

build.gradle:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.0.0-beta6'
    }
}
apply plugin: 'com.android.application'

repositories {
    maven { url 'http://maven.android-forever.com' }
    jcenter()
}

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        applicationId "com.test.app"
        minSdkVersion 16
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
        vectorDrawables.useSupportLibrary = true
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.2.0'
    compile 'com.android.support:design:23.2.0'
    compile "de.greenrobot:eventbus:2.4.0"
    compile 'de.greenrobot:greendao:2.1.0'
    compile "com.af:android-utility:1.0.0.9"
    compile project(':volleyplus')
    compile project (':libvlc')
}

triangle.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/triangle_v"/>
</selector>

triangle_v.xml

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:height="100dp"
    android:width="100dp"
    android:viewportHeight="100"
    android:viewportWidth="100">

<path
    android:name="triangle"
    android:fillColor="#FF0000"
    android:pathData="m 50,0 l 50,100 -100,0 z"/>

</vector>

layout.xml

<ImageView
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:background="@drawable/triangle"/>

我也试过 app:srcCompat,在那种情况下,drawable 只是不显示。

您还需要包含新的矢量支持库:

compile 'com.android.support:support-vector-drawable:23.2.0'

问题是我的 activity 不是扩展 AppCompatActivity 而是常规 Activity

这在任何 documentation/example 支持矢量绘图中都没有指定

我在 code.google 上发现了这个问题。

看来是和你一样的问题。 这有帮助吗? https://code.google.com/p/android/issues/detail?id=201843

这是 API19 中出现的 support-v4、appcompat-v7 库 v23.2.0 错误。 @tim 提供 link 这个错误问题。

您可以升级到新的库版本 23.2.1,错误现已修复。

我遇到了类似的问题,@pedja 自己的回答很有用。 更一般地说,如 Chris Banes's article on vector drawable compat 中所述,支持库通过一些挂钩将其 ImageView 版本注入到 pre-L 系统上。这隐含地要求使用 classes 的 AppCompat 版本,例如 AppCompatActivity

在我的例子中,矢量可绘制对象在没有关联 activity 的独立 toast 类视图中使用,使用应用程序上下文。我最终直接在 xml 布局定义中使用 AppCompatImageView,即

<android.support.v7.widget.AppCompatImageView
             android:id="@+id/some_id"
             android:layout_width="24dp"
             android:layout_height="24dp"
             android:src="@drawable/selector_referencing_vector_drawable"/>

因此不需要神奇的 "hook" 机制。经过测试,这也适用于 Activity class 而无需使用 AppCompatActivity。以上所有都是在没有升级到 23.2.1 的情况下完成的,这解决了一个不同的问题。

如果使用
,此代码将与矢量一起工作 vectorDrawables.useSupportLibrary = 真

并将android:src更改为app:srcCompat

例如,

<ImageView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:src="@drawable/triangle"/>

<ImageView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:srcCompat="@drawable/triangle"/>

适用于 23.2.0 或 23.4.0,不适用于 23.3.0。认真的Google!

First up, this functionality was originally released in 23.2.0, but then we found some memory usage and Configuration updating issues so we it removed in 23.3.0. In 23.4.0 (technically a fix release) we’ve re-added the same functionality but behind a flag which you need to manually enable.

参考:https://medium.com/@chrisbanes/appcompat-v23-2-age-of-the-vectors-91cbafa87c88#.waicp19gh

如果您发现自己在加载矢量可绘制对象时使用 <android.support.v7.widget.AppCompatImageView,那么扩展 AppCompatActivity 而不是 Activity 并返回使用常规 <ImageView...app:srcCompat="@drawable/... 可能是更好的主意]

在 pre-lollipop 设备上从选择器加载矢量时也遇到了这个问题:

在您的 onCreate 方法中使用 AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)

Sets whether vector drawables on older platforms (< API 21) can be used within android.graphics.drawable.DrawableContainer resources. When enabled, AppCompat can intercept some drawable inflation from the framework, which enables implicit inflation of vector drawables within android.graphics.drawable.DrawableContainer resources.

protected final void onCreate(Bundle savedInstanceState) {
         AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
         super.onCreate(savedInstanceState);
         ...

此处给出的答案忽略了您希望将可绘制对象添加到文本视图的情况,因为它会产生相同的错误。就我而言,我有

<TextView .... android:drawableLeft="some_vectore_drawable" />

我找不到解决这个问题的方法,所以我从 xml 代码中删除了该行,并以这种方式将其放入我的 java 代码中

Drawable somevectordrable = AppCompatDrawableManager.get().getDrawable(context, R.drawable.somevectordrawable);
mytextview.setCompoundDrawableWithIntrinsicBounds(somevectordrable, null, null, null);

代码说明,

  1. 使用 AppCompatDrawableManager 从 drawables 文件夹中获取矢量 drawable

  2. 将我们刚刚得到的drawable设置为我们textview上的left drawable

这就是我在 Internet 上喜欢的所有内容,而且对我有用。检查你错过了哪一个。

1) 里面 build.gradle

 android {
        ...
        defaultConfig {
            ...
            vectorDrawables.useSupportLibrary = true
        }
  }

2) 必须使用buildToolsVersion '27.0.3'compile 'com.android.support:appcompat-v7:27.0.3'相似的版本代码。

3) 使用更高版本 3 gradle 版本
classpath 'com.android.tools.build:gradle:3.0.1'

4) 对于 ImageView 使用 app:srcCompat

xmlns:app="http://schemas.android.com/apk/res-auto"
app:srcCompat="@drawable/ic_logo"

5) 但如果您需要 android:drawableLeftandroid:drawableRigth 等,则:

ic_logo.xml (Vector xml)

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:width="@dimen/home.button.icon"
    android:height="@dimen/home.button.icon"
    android:viewportWidth="24.0"
    android:viewportHeight="24.0"
    tools:ignore="VectorRaster">
    <path
        android:fillColor="#FFFFFF"
        android:pathData="M9,16.17L4.83,12l-1.42,1.41L9,19 21,7l-1.41,-1.41z"/>
</vector>

ic_logo_select.xml (Vector selector)

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true"
        android:drawable="@drawable/ic_logo" />
    <item android:drawable="@drawable/ic_logo" />
</selector>

Now you can use android:drawableLeft or android:drawableRight

<android.support.v7.widget.AppCompatButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:drawableLeft="@drawable/ic_logo_select"/>

6) 最后,setCompatVectorFromResourcesEnabled = true inside static 在 main 方法之前加载。

public class MainActivity extends AppCompatActivity {
     static {
            AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
     }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ....
    }
}

如果您在 drawableLeft/drawableStart 等方面遇到此问题,如果您使用的是数据绑定,那么有一个简单的解决方案。

而不是:

android:drawableLeft="@drawable/somevector" ❌

做:

android:drawableLeft="@{@drawable/somevector}" ✅

这是可行的,因为数据绑定将在编译时生成代码,以兼容的方式检索可绘制对象。

如果您遇到 drawableLeftdrawableRightdrawableTopdrawableXxx 等的异常问题...以及您的项目 buildToolsVersion > 26.0.2

去检查你的应用级别 gradle 文件,删除 vectorDrawables.useSupportLibrary = true 如果存在,然后崩溃消失。

这是因为 buildTools 将在 26.0.2 之后处理矢量资源,但不知何故与 vectorDrawables.useSupportLibrary = true 冲突。

2019/03/27 测试。

(如果您在应用级别 gradle 文件中找不到 buildToolsVersion,这意味着您正在使用 Android 插件 Gradle 3.0.0或更高版本,您的项目会自动使用插件指定的构建工具的默认版本。在这种情况下,您的 buildToolsVersion 已经大于 26.0.2)

我很惊讶这里还没有提到这一点。

此崩溃经常发生在:

android:drawableRight
android:drawableLeft
android:drawableTop
android:drawableBottom
android:drawableStart
android:drawableEnd

一个常见的解决方法是创建另一个用 <selector><item android:drawable=""></selector> 包装可绘制对象的可绘制对象,或者使用代码设置复合可绘制对象,但现在您可以改为使用:

app:drawableRightCompat
app:drawableLeftCompat
app:drawableTopCompat
app:drawableBottomCompat
app:drawableStartCompat
app:drawableEndCompat

这已添加到 appcompat 1.1.0-alpha01 中的 AppCompatTextView

要使用该属性,我必须使用 AppCompat 视图而不是通常的视图,例如。我用 AppCompatButton 而不是 Button.


不确定您是否需要 vectorDrawables.useSupportLibrary trueAppCompatDelegate.setCompatVectorFromResourcesEnabled(true)(我都有)。查看 Nick Butcher 的这篇文章:https://medium.com/androiddevelopers/using-vector-assets-in-android-apps-4318fd662eb9.