Android 支持库:getDrawable 独立于矢量或非矢量

Android Support Library: getDrawable independent if vector or not

使用 Android >= 5.0 时,

Drawable d = getResources().getDrawable(R.drawable.icon)

正确解析 XML 和 returns 一个有效的可绘制对象。但是当使用新的 Vector Drawable Support Library(版本 23.4,Gradle 2.1.2)时,此代码 在 Android 4.

下崩溃

android.content.res.Resources$NotFoundException

...

Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line #2: invalid drawable tag vector

解决方案是使用

Drawable d = VectorDrawableCompat.create(getResources(), R.drawable.icon, null);

但是如果资源不是矢量资源,这会崩溃:

java.io.FileNotFoundException: Corrupt XML binary file

那么必须使用什么代码来代替第一行,以便它与 Android 4 和 Android 6 以及矢量和非矢量绘图一起工作 - 例如在所有情况下,这条线都用于 Android 5.0+ 项目?支持库文章没有提到执行此迁移的方法

我找到了解决方案。

您需要在 activity 中手动添加对 VectorDrawable 的支持。

在您的 activity 中试试这个:

static {
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}

您应该查看此 blog entry 了解更多信息。

5.0之前的Vector Drawable可以使用以下方法获取drawable

Drawable drawable = AppCompatResources.getDrawable(mContext, mImageTitleResId);

目前我发现的另一种可能的解决方案

ResourcesCompat.getDrawable(context.resources, resId, theme)

上下文应该是您的 activity(但不是应用程序上下文)