Android 无效的可绘制标记向量
我尝试在棒棒糖前的设备上使用矢量绘图。我按照指示做了所有的事,但我还是受到了这次撞击 build.gradle: triangle.xml: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"/>
<?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" />
对守则的澄清
这就是我在互联网上所喜欢的一切,这对我来说是一种工作。检查你错过了哪一个 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