无效的可绘制标记向量

时间:2016-03-05 20:11:37

标签: android android-vectordrawable

我试图在棒棒糖前设备上使用矢量绘图。我按照指示做了所有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只是不显示。

14 个答案:

答案 0 :(得分:29)

如果使用
,此代码将与vector一起使用     vectorDrawables.useSupportLibrary = true

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"/>

答案 1 :(得分:27)

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

在我的例子中,使用Application上下文,vector drawable在没有相关活动的独立toast-like视图中使用。我最终直接在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"/>
因此,不需要神奇的“钩子”机制。经过测试,这也适用于Activity类,而无需使用AppCompatActivity。所有上述操作都是在没有升级到23.2.1的情况下完成的,这解决了另一个问题。

答案 2 :(得分:24)

在棒棒糖前设备上从选择器加载矢量时也遇到了这个问题:

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

  

设置旧平台(&lt; API 21)上的矢量drawable是否可以   在android.graphics.drawable.DrawableContainer资源中使用。   启用后,AppCompat可以截取一些可绘制的通货膨胀   框架,它可以实现内部矢量抽象的隐式膨胀   android.graphics.drawable.DrawableContainer资源。

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

答案 3 :(得分:18)

问题是我的活动没有延伸AppCompatActivity而是定期Activity

在支持向量drawables

的任何文档/示例中都没有指定

答案 4 :(得分:10)

这里给出的答案忽略了当您希望将drawable添加到textview时的情况,因为它会给出相同的错误。在我的情况下,我有

<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文件夹中获取矢量

  2. 在我们的textview上设置我们刚刚得到的drawable作为左侧drawable

答案 5 :(得分:6)

您还需要包含新的载体支持库:

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

答案 6 :(得分:6)

适用于23.2.0或23.4.0,而非23.3.0。认真地谷歌!

  

首先,这个功能最初是在23.2.0发布的,但是   然后我们发现了一些内存使用和配置更新问题   我们在23.3.0中删除了它。在23.4.0(技术上是一个修复版)我们已经   重新添加相同的功能,但在您需要的标志后面   手动启用。

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

答案 7 :(得分:5)

That's all I fond over the internet, and it's work for me. Check which one you miss.

1) Inside build.gradle

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

2) Must use buildToolsVersion '27.0.3' and compile 'com.android.support:appcompat-v7:27.0.3' similar version code.

3) Use upper then 3 gradle version
classpath 'com.android.tools.build:gradle:3.0.1'

4) For ImageView use app:srcCompat

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

5) But if you need android:drawableLeftor android:drawableRigth etc then:

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) And at the end, setCompatVectorFromResourcesEnabled = true inside static which loads before the main method.

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

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

答案 8 :(得分:1)

这是API 19中出现的support-v4,appcompat-v7库v23.2.0错误。 @tim提供了这个bug问题的链接。

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

答案 9 :(得分:1)

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

代替:

android:drawableLeft="@drawable/somevector" ❌

要做:

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

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

答案 10 :(得分:1)

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

此崩溃通常发生在:

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

答案 11 :(得分:0)

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

它似乎和你一样。 这有帮助吗? https://code.google.com/p/android/issues/detail?id=201843

答案 12 :(得分:0)

如果您在加载向量drawable时看到自己使用ServletContainerInitializer,那么扩展<android.support.v7.widget.AppCompatImageView而不是AppCompatActivity可能更好一点,并回到使用常规Activity < / p>

答案 13 :(得分:0)

如果您遇到drawableLeftdrawableRightdrawableTopdrawableXxx等例外情况,而您的项目buildToolsVersion> {{1} }。

去检查应用程序级别的gradle文件,删除26.0.2(如果存在),然后崩溃消失。

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

在2019/03/27测试。

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