43

我试图在前棒棒糖设备上使用矢量可绘制对象。我按照这里的指示做了所有事情,但我仍然遇到这个崩溃。

构建.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')
}

三角形.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>

布局.xml

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

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

4

14 回答 14

33

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

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

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

protected final void onCreate(Bundle savedInstanceState) {
         AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
         super.onCreate(savedInstanceState);
         ...
于 2017-01-13T08:06:13.770 回答
33


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

并更改android:srcapp: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"/>
于 2016-05-17T11:26:38.560 回答
27

我遇到了类似的问题,@pedja 自己的回答很有用。更一般地说,正如Chris Banes 关于矢量可绘制兼容性的文章ImageView中所提到的,支持库通过一些钩子在 pre-L 上注入其版本的系统版本来工作。这隐含地要求使用 AppCompat 版本的类,例如AppCompatActivity

在我的例子中,vector drawable 在一个独立的类 toast 视图中使用,没有关联的活动,使用应用程序上下文。我最终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"/>

因此不需要神奇的“钩子”机制。经过测试,这也适用于Activity类,而无需使用AppCompatActivity. 上述所有操作都没有升级到 23.2.1,它解决了一个不同的问题。

于 2016-03-15T15:14:51.657 回答
19

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

这在支持向量可绘制对象的任何文档/示例中均未指定

于 2016-03-06T10:26:11.357 回答
14

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

<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. 将我们刚刚得到的drawable设置为textview上的left drawable

于 2017-07-30T08:13:26.937 回答
8

这就是我在互联网上所喜欢的,它对我有用。检查你错过了哪一个。

1)内部build.gradle

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

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

3)使用upper then 3 gradle version
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(矢量 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(矢量选择器)

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

现在你可以使用android:drawableLeftandroid: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 在静态内部,在 main 方法之前加载。

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

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ....
    }
}
于 2018-02-26T17:43:21.730 回答
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

于 2016-05-31T10:38:46.387 回答
6

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

compile 'com.android.support:support-vector-drawable:23.2.0'
于 2016-03-05T20:42:00.063 回答
4

drawableLeft如果您对, drawableRight,drawableTop等有此异常问题drawableXxx...以及您的项目buildToolsVersion> 26.0.2.

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

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

于 2019 年 3 月 27 日测试。

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

于 2019-03-27T00:14:37.907 回答
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

这已添加到AppCompatTextViewappcompat 1.1.0-alpha01中。

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


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

于 2020-07-20T11:30:12.863 回答
1

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

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

于 2016-03-11T10:13:00.803 回答
1

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

代替:

android:drawableLeft="@drawable/somevector" ❌

做:

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

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

于 2018-10-22T08:56:21.577 回答
0

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

于 2016-07-08T16:00:59.017 回答
0

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

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

于 2016-03-07T12:57:45.170 回答