我试图在棒棒糖前设备上使用矢量绘图。我按照指示做了所有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只是不显示。
答案 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);
澄清代码,
使用AppCompatDrawableManager从drawables文件夹中获取矢量
在我们的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:drawableLeft
or 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 true
和AppCompatDelegate.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)
如果您遇到drawableLeft
,drawableRight
,drawableTop
,drawableXxx
等例外情况,而您的项目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)