web-dev-qa-db-ja.com

ドローアブルリソースがVectorDrawableである場合、TypedArrayを介してDrawableオブジェクトを取得するにはどうすればよいですか?

カスタム属性を使用してカスタム複合ビューを作成しました。カスタム属性の1つはドローアブルであり、使用したいファイルはベクタードローアブルです。

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

XmlPullParserExceptionが発生し続けます:バイナリXMLファイルの行#1:無効なドローアブルタグベクトル

どうしてこれなの?

14
TomTaila

解決しました。

私は次のことをする必要がありました:

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

ソリューションの pskink および creck のクレジット。

16
TomTaila

サポートライブラリ

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を取得し、サポートクラスContextCompatを使用してこのドローアブルのインスタンスを作成します

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