【问题标题】:How do you get a Drawable object via a TypedArray when the drawable resource is a Vector Drawable?当 drawable 资源是 Vector Drawable 时,如何通过 TypedArray 获取 Drawable 对象?
【发布时间】:2017-08-09 08:18:38
【问题描述】:

我编写了一个带有自定义属性的自定义复合视图。其中一个自定义属性是 drawable,而我希望使用的文件是 Vector Drawable。

val typedArray = context.obtainStyledAttributes(attrs, R.styleable.CustomView, 0, 0)
val iconDrawable = typedArray.getDrawable(R.styleable.CustomView_icon_drawable)

我不断收到 XmlPullParserException: Binary XML file line #1: invalid drawable tag vector

这是为什么?

【问题讨论】:

  • 你的drawable正确吗? Android 不支持 svg,但支持矢量绘图。这些有点不同。
  • 是的 - 我编辑这个说 Vector Drawable 而不是 SVG
  • 也许尝试使用typedArray.getResourceId(..)获取drawable resourceId,然后使用ContextCompat.getDrawable(Context context, @DrawableRes int id)创建一个Drawable实例?
  • 您运行的 API 级别是什么?
  • 我的最小值是 16,但我设置了 vectorDrawables.useSupportLibrary = true 设置。此外,我的父活动正在扩展 AppCompatActivity

标签: android android-vectordrawable


【解决方案1】:

支持库

自 Android 4.4 (API 20) 起支持矢量可绘制对象。因此,如果您在 build.gradle 文件中的最低 API 级别 (minSdkVersion) 设置为小于 20,请确保您使用的是支持库。

要启用支持库,请将以下行添加到您的应用级 build.gradle

android {
    defaultConfig {
        vectorDrawables.useSupportLibrary = true
    }
}


自定义属性定义

attrs.xml 中将您的属性定义为引用类型:

<declare-styleable name="CustomView">
    <attr name="icon_drawable" format="reference" />
</declare-styleable>


获取drawable实例

最后,为了能够在您的 .xml 布局文件中获取指定可绘制对象的实例,获取可绘制资源 ID 并使用支持类 ContextCompat 创建此可绘制对象的实例

final int drawableResId = typedArray.getResourceId(R.styleable.CustomView_icon_drawable, -1);
final Drawable drawable = ContextCompat.getDrawable(getContext(), drawableResId)

【讨论】:

  • 我正在使用支持库,因为我的最小 API 为 16。我尝试了使用 ContextCompat 的最后一种方法,但仍然没有运气。我的 res/drawable 文件夹中有一个名为“ic_close.xml”的矢量可绘制文件。在我看来 xml 我有以下行: app:icon_drawable="@drawable/ic_close" 不确定发生了什么。
【解决方案2】:

解决了。

我需要做以下事情:

val drawableResId = typedArray.getResourceId(R.styleable.CustomView_icon_drawable, -1);
val drawable = AppCompatResources.getDrawable(getContext(), drawableResId)

感谢pskinkcreck 提供解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 2017-10-02
    • 2023-04-02
    • 1970-01-01
    • 2011-06-16
    • 1970-01-01
    • 2011-05-18
    相关资源
    最近更新 更多