无效的可绘制标签向量

ped*_*dja 38 android android-vectordrawable

我试图在前棒棒糖设备上使用矢量drawables.我按照这里的指示完成了所有操作,但我仍然遇到了这次崩溃.

的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')
}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

layout.xml

<ImageView
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:background="@drawable/triangle"/>
Run Code Online (Sandbox Code Playgroud)

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

але*_*кей 29

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

android:src改为app:srcCompat.

例如,

<ImageView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:src="@drawable/triangle"/>
Run Code Online (Sandbox Code Playgroud)

<ImageView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:srcCompat="@drawable/triangle"/>
Run Code Online (Sandbox Code Playgroud)

  • 这才是真正的答案!它不应该是另一个,除非你真的忘了扩展AppCompatActivity. (3认同)
  • 这个答案对我有帮助.编辑清晰.原作者应该比两张票更好. (2认同)

hea*_*uck 27

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

在我的例子中,使用Application上下文,vector drawable用于独立的toast-like视图,没有相关的活动.我最终AppCompatImageView直接在xml布局定义中使用,例如

<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"/>
Run Code Online (Sandbox Code Playgroud)

因此,不需要神奇的"钩子"机制.经测试,这也适用于Activity该类而无需使用AppCompatActivity.所有上述操作都是在没有升级到23.2.1的情况下完成的,后者解决了另一个问题.

  • <cough>仅仅是我还是Google员工疏忽为TextView drawables提供app-compat解决方案?(例如`android:drawableLeft ="@ drawable/somevector"`)</ cough> (17认同)
  • 不,你应该使用`app:srcCompat`而不是`android:src`来让Lollipop前矢量绘图工作. (5认同)

Ald*_*asa 26

从前棒棒糖设备上的选择器加载向量时也遇到此问题:

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

设置是否可以在android.graphics.drawable.DrawableContainer资源中使用旧平台(<API 21)上的矢量绘图.启用后,AppCompat可以拦截框架中的一些可绘制通货膨胀,从而实现android.graphics.drawable.DrawableContainer资源中矢量drawable的隐式通货膨胀.

protected final void onCreate(Bundle savedInstanceState) {
         AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
         super.onCreate(savedInstanceState);
         ...
Run Code Online (Sandbox Code Playgroud)

  • 即使我有'app:srcCompat',我也面临着问题的问题.但这个答案解决了我的问题. (3认同)

ped*_*dja 18

问题是我的活动没有扩展,AppCompatActivity而是经常Activity.

对于支持向量drawable,没有在任何文档/示例中指定


nad*_*ada 11

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

<TextView .... android:drawableLeft="some_vectore_drawable" />
Run Code Online (Sandbox Code Playgroud)

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

Drawable somevectordrable = AppCompatDrawableManager.get().getDrawable(context, R.drawable.somevectordrawable);
mytextview.setCompoundDrawableWithIntrinsicBounds(somevectordrable, null, null, null);
Run Code Online (Sandbox Code Playgroud)

澄清代码,

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

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


Gaë*_*tan 6

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

compile 'com.android.support:support-vector-drawable:23.2.0'
Run Code Online (Sandbox Code Playgroud)

  • 不,通过设置`vectorDrawables.useSupportLibrary = true`隐式包含该libray (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


Md *_*ury 5

这就是我在互联网上喜欢的一切,对我来说就是工作。检查您错过了哪一个。

1)在build.gradle内部

 android {
        ...
        defaultConfig {
            ...
            vectorDrawables.useSupportLibrary = true
        }
  }
Run Code Online (Sandbox Code Playgroud)

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"
Run Code Online (Sandbox Code Playgroud)

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

ic_logo.xml(矢量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>
Run Code Online (Sandbox Code Playgroud)

ic_logo_select.xml(向量选择器)

<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>
Run Code Online (Sandbox Code Playgroud)

现在您可以使用android:drawableLeftandroid:drawableRight

<android.support.v7.widget.AppCompatButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:drawableLeft="@drawable/ic_logo_select"/>
Run Code Online (Sandbox Code Playgroud)

6)最后,在内部加载方法setCompatVectorFromResourcesEnabled = true,该方法在main方法之前加载。

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

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ....
    }
}
Run Code Online (Sandbox Code Playgroud)