【问题标题】:Android Support Library: getDrawable independent if vector or notAndroid 支持库:getDrawable 是否独立于矢量与否
【发布时间】:2016-10-07 16:36:33
【问题描述】:

使用 Android >= 5.0 时,

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

正确解析 XML 并返回有效的可绘制对象。但是当使用新的Vector Drawable Support Library(版本 23.4,Gradle 2.1.2)时,此代码在 Android 4 下崩溃

android.content.res.Resources$NotFoundException

...

原因:org.xmlpull.v1.XmlPullParserException:二进制 XML 文件第 2 行:无效的可绘制标签矢量

解决方案是使用

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

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

java.io.FileNotFoundException:损坏的 XML 二进制文件

那么必须使用什么代码而不是第一行,以便它适用于 Android 4 和 Android 6 以及矢量和非矢量可绘制对象 - 例如在所有情况下,这条线都用于 Android 5.0+ 项目?支持库文章未提及执行此迁移的方法

【问题讨论】:

  • 我假设他们希望开发人员预先知道资源是否是可绘制的矢量。这对应用程序开发人员来说是合理的,但对库开发人员来说则不然。即兴发挥,我会尝试VectorDrawableCompat,如果你得到FileNotFoundException,我会回退到getDrawable()

标签: java android android-support-library android-vectordrawable android-support-design


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 在支持库 24.2.x 中可用。
    • 非常感谢!在 5.0 之前的设备上使用矢量可绘制对象时,帮助我们修复了应用程序中始终重现的崩溃问题。
    • 这应该是答案。
    【解决方案3】:

    我找到了解决办法。

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

    在你的活动中试试这个:

    static {
        AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
    }
    

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

    【讨论】:

    • 谢谢,成功了。仅供参考,它是“setCompatVectorFromResourcesEnabled()”,博文有错别字。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-19
    • 2017-12-17
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多