当drawable 资源是Vector Drawable 时,如何通过TypedArray 获取Drawable 对象?

How do you get a Drawable object via a TypedArray when the drawable resource is a 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

这是为什么?

支持库

从 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>


获取可绘制实例

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

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

已解决。

我需要执行以下操作:

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

解决方案归功于 pskink and creck