使用androidvector在前棒棒糖崩溃的Drawables

我在android 之前使用vectordrawables在棒棒糖和这些是我的图书馆和工具版本:

  • Android Studio:2.0
  • Android的Gradle插件:2.0.0
  • 构build工具:23.0.2
  • Android支持库:23.3.0

我在我的应用程序级别Build.Gradle添加了此属性

 android { defaultConfig { vectorDrawables.useSupportLibrary = true } } 

另外值得一提的是,我在Android官方博客( 链接这里 )中使用了一个额外的drawable,比如LayerDrawable(layer_list),用于在app:srcCompat之外设置向量drawable的drawables app:srcCompat

 <level-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/search"/> </level-list> 

你会发现在应用程序之外直接引用vector绘图:srcCompat在Lollipop之前将会失败。 但是,AppCompat支持在另一个可绘制容器(如StateListDrawable,InsetDrawable,LayerDrawable,LevelListDrawable和RotateDrawable)中引用它们时加载vector绘图。 通过使用这种间接方式 ,可以在TextView的android:drawableLeft属性(如通常不能支持vector绘图)的情况下使用vector绘图。

当我使用的app:srcCompat一切工作正常,但是当我使用:

 android:background android:drawableLeft android:drawableRight android:drawableTop android:drawableBottom 

ImageViewImageButtonTextViewEditText之前的棒棒糖,它抛出一个期待

 Caused by: android.content.res.Resources$NotFoundException: File res/drawable/search_toggle.xml from drawable resource ID #0x7f0200a9 

Solutions Collecting From Web of "使用androidvector在前棒棒糖崩溃的Drawables"

我认为这是因为支持向量在最新的库版本23.3.0中被禁用

根据这篇文章:

对于AppCompat用户,我们已经决定删除​​由于在版本23.2.0 / 23.2.1 (ISSUE 205236)中的实现中发现的问题而使用来自棒棒糖前设备上的资源的vector绘图的function。 使用app:srcCompat和setImageResource()继续工作。

如果您访问问题205236 ISSUE 205236 ,似乎他们将在未来启用,但记忆问题不应该很快被解决:

在下一个版本中,我添加了一个select性API,您可以重新启用已删除的VectorDrawable支持。 它与之前的警告一样(内存使用和configuration更新的问题)。

我有类似的问题。 所以,在我的情况下,我还原了所有使用从资源向量绘制的图标到PNG图像(因为内存问题将继续发生,即使它们提供了一个选项来启用它)。

我不确定这是否是最好的select。 但它修复了所有的崩溃。

UPDATE

他们重新启用了VectorDrawable in
Android支持库23.4.0

对于AppCompat用户 ,我们已经添加了一个select性的 API来通过AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)从资源(23.2中的行为)重新启用支持Vector Drawables – 请记住,这仍然可以导致内存使用问题和更新configuration实例的问题,因此为什么默认情况下是禁用的。

也许build.gradle设置现在已经过时,你只需要启用它在适当的活动(但是,需要testing)。

现在,要启用它,你必须这样做:

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

详细说明其他非常好的答案 ,这里是一个图表 ,可以帮助你。 如果支持库从23.4.0到至less25.1.0,这是有效的。

VectorDrawable作弊表

Guillherme P的答案非常棒。 只是做一个小小的改进,你不需要在每一个活动中添加这一行,如果你在Application类中添加一次,它也可以工作。

 public class App extends Application { static { AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); } 

注意:您仍然需要在gradle中启用支持库:

 android { defaultConfig { vectorDrawables.useSupportLibrary = true } } 

此外,确保您使用的支持库版本大于v23.4,当Google添加了对VectorDrawables的可绘制容器的支持时( 发行说明 )

注意 :无论如何,我build议使用PNGs,直到谷歌提出了一个更好的修复或者你可能有内存问题。

我有同样的问题。 但是做了很多研发我得到了答案。

对于Imageview和ImageButton,使用app:srcCompat =“@ drawable / ….”,对于其他视图,如Button,Textview,而不是在XML中使用“drawableLeft / right …”,则将drawables编程指定为:

 button.setCompoundDrawablesWithIntrinsicBounds(AppCompatResources.getDrawable(mContext,R.drawable.ic_share_brown_18dp), null, null, null); 

并使用“AppCompatResources”来获取drawable。

在棒棒糖的VectorDrawables应该工作得很好,而不使用

 AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); 

如果你想在ImageViews中使用VectorDrawables,你可以使用属性srcCompat ,它可以工作,但是在Buttons或TextViews中它不会 ,所以你需要将Drawable包装到InsetDrawable或者LayerDrawable中。 我发现了另一个技巧,如果你正在使用数据绑定,你可以这样做:

 android:drawableLeft="@{@drawable/vector_ic_access_time_24px}" android:drawableStart="@{@drawable/vector_ic_access_time_24px}" 

这将奇迹般的工作,我还没有调查幕后发生了什么,但我猜TextView是使用AppCompatResources或类似的getDrawable方法。

我有同样的问题。 并通过删除来修复它

 vectorDrawables.useSupportLibrary = true 

我的目标版本是25,支持库是

  compile 'com.android.support:appcompat-v7:25.3.1' 

我在Pre-lollipop设备上使用VectorDrawables,这就是我的做法: –

第1步:把它放在你的应用程序级别中。

 android { defaultConfig { vectorDrawables.useSupportLibrary = true } } 

第2步:

把它放在你的Application类中,不要忘记在清单文件中注册你的Application类。

 public class App extends Application { static { AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); } } 

第3步:

获取VectorDrawables使用,

 imageView.setImageDrawable(ContextCompat.getDrawable(this, R.drawable.my_vector_drawable)); 

对于任何升级到Android Gradle 3.0或更高版本的用户,不需要使用AppCompatDelegate.setCompatVectorFromResourcesEnabled(true) ,或者设置vectorDrawables.useSupportLibrary = true (添加这将导致问题),并使用app:srcCompat ,它只是工作。

本尼答案的另一种select是创build一个Activity超类:

 public abstract class VectorDrawableActivity extends AppCompatActivity { static { AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); } //... } 

现在扩展VectorDrawableActivity而不是AppCompatActivity

Guilherme P的build议不适合我。 我继续前进,并决定使用PNG的地方,我需要做的事情之外的应用程序:srcCompat ie drawableLeft,drawableRight等这是一个非常容易的变化,并没有潜在的内存问题AppCompatDelegate.setCompatVectorFromResourcesEnabled(真正); 介绍。