Android 无效的可绘制标记向量

Android 无效的可绘制标记向量,android,android-vectordrawable,Android,Android Vectordrawable,我尝试在棒棒糖前的设备上使用矢量绘图。我按照指示做了所有的事,但我还是受到了这次撞击 build.gradle: 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"/>

我尝试在棒棒糖前的设备上使用矢量绘图。我按照指示做了所有的事,但我还是受到了这次撞击

build.gradle:

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>

三角形v.xml


layout.xml



我还尝试了
app:srcCompat
,在这种情况下,drawable就是不显示。

您还需要包括新的向量支持库:

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

问题是我的活动不是扩展
AppCompatActivity
,而是常规的
activity


这在支持向量绘图的任何文档/示例中都没有指定

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

这似乎与您的问题相同。 这有用吗?
这是API 19中出现的support-v4、appcompat-v7库v23.2.0错误。 @tim提供了此错误问题的链接


您可以升级到新的库版本23.2.1,bug现在已经修复。

我遇到了类似的问题,@pedja自己的答案很有用。 更一般地说,如中所述,支持库通过一些挂钩将其版本的
ImageView
注入pre-L上的system one。这隐含地要求使用类的AppCompat版本,例如
AppCompatActivity

在我的例子中,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"/>


因此,不需要神奇的“钩子”机制。经测试,这也适用于
活动
类,无需使用
AppCompatActivity
。以上所有操作都是在没有升级到23.2.1的情况下完成的,23.2.1解决了一个不同的问题。

如果使用
vectorDrawables.useSupportLibrary=true

并将android:src更改为
app:srcCompat

比如说,




它适用于23.2.0或23.4.0,而不是23.3.0。说真的,谷歌

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


Ref:

如果您看到自己在使用
时,从棒棒糖前设备上的选择器加载向量时也遇到了此问题:

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

设置是否可以在较旧的平台(
这里给出的答案忽略了一种情况,即您希望向textview添加一个drawable,因为它会给出相同的错误。就我而言,我有

<TextView .... android:drawableLeft="some_vectore_drawable" />
对守则的澄清

  • 使用AppCompativeDrawableManager从drawables文件夹获取向量drawable

  • 将我们刚刚获得的可绘图设置为textview上的左侧可绘图


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

    1) 内部build.gradle

     android {
            ...
            defaultConfig {
                ...
                vectorDrawables.useSupportLibrary = true
            }
      }
    
    2) 必须使用
    buildToolsVersion'27.0.3'
    compile'com.android.support:appcompat-v7:27.0.3'
    类似的版本代码

    3) 使用上三级版本
    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:drawableLeft
    android:drawableRigth
    等,那么:

    ic_logo.xml(矢量xml)


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

    而不是:

    android:drawableLeft="@drawable/somevector" ❌
    
    做:


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

    如果您在
    drawableLeft
    drawableRight
    drawableTop
    drawableXxx
    等方面存在此异常问题。。。以及您的项目
    buildToolsVersion
    26.0.2

    检查你的应用程序级渐变文件,删除vectorDrawables.useSupportLibrary=true(如果存在),然后崩溃消失

    这是因为buildTools将在26.0.2之后处理向量资源,但在某种程度上与
    vectorDrawables.useSupportLibrary=true
    冲突

    于2019/03/27测试


    (如果在应用程序级别的gradle文件中找不到您的
    buildToolsVersion
    ,这意味着您正在使用Android plugin for gradle 3.0.0或更高版本,您的项目将自动使用插件指定的默认版本的构建工具。在这种情况下,您的
    buildToolsVersion
    已经大于26.0.2)我很惊讶这里还没有提到这一点

    此崩溃通常发生在以下情况:

    android:drawableRight
    android:drawableLeft
    android:drawableTop
    android:drawableBottom
    android:drawableStart
    android:drawableEnd
    
    一个常见的修复方法是创建另一个drawable,用
    包装drawable,或者使用代码设置复合drawable,但现在您可以使用:

    app:drawableRightCompat
    app:drawableLeftCompat
    app:drawableTopCompat
    app:drawableBottomCompat
    app:drawableStartCompat
    app:drawableEndCompat
    
    这已添加到中的
    AppCompatTextView

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



    不确定是否需要
    vectorDrawables.useSupportLibrary true
    AppCompatDelegate.SetCompatrVectorFromResourcesEnabled(true)
    (我两者都有)。查看Nick Butcher的这篇文章:。

    不,库是通过设置
    vectorDraw隐式包含的
    
    <TextView .... android:drawableLeft="some_vectore_drawable" />
    
    Drawable somevectordrable = AppCompatDrawableManager.get().getDrawable(context, R.drawable.somevectordrawable);
    mytextview.setCompoundDrawableWithIntrinsicBounds(somevectordrable, null, null, null);
    
     android {
            ...
            defaultConfig {
                ...
                vectorDrawables.useSupportLibrary = true
            }
      }
    
    xmlns:app="http://schemas.android.com/apk/res-auto"
    app:srcCompat="@drawable/ic_logo"
    
    <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>
    
    <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.support.v7.widget.AppCompatButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:drawableLeft="@drawable/ic_logo_select"/>
    
    public class MainActivity extends AppCompatActivity {
         static {
                AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
         }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            ....
        }
    }
    
    android:drawableLeft="@drawable/somevector" ❌
    
    android:drawableLeft="@{@drawable/somevector}" ✅
    
    android:drawableRight
    android:drawableLeft
    android:drawableTop
    android:drawableBottom
    android:drawableStart
    android:drawableEnd
    
    app:drawableRightCompat
    app:drawableLeftCompat
    app:drawableTopCompat
    app:drawableBottomCompat
    app:drawableStartCompat
    app:drawableEndCompat