web-dev-qa-db-ja.com

スタイル付き属性で使用されるドローアブルリファレンスのリソースIDを取得します

このカスタムビューMyViewを使用して、いくつかのカスタム属性を定義します。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="MyView">
        <attr name="normalColor" format="color"/>
        <attr name="backgroundBase" format="integer"/>
    </declare-styleable>   
</resources>

そして、レイアウトXMLで次のように割り当てます。

    <com.example.test.MyView
        Android:id="@+id/view1"
        Android:text="@string/app_name"
        . . .
        app:backgroundBase="@drawable/logo1"
        app:normalColor="@color/blue"/>

最初は、次を使用してカスタム属性backgroundBaseを取得できると思いました。

TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.MyView, defStyle, 0);
int base = a.getInteger(R.styleable.MyView_backgroundBase, R.drawable.blank);

これは、属性が割り当てられておらず、デフォルトのR.drawable.blankが返される場合にのみ機能します。
app:backgroundBaseが割り当てられると、例外がスローされます "整数型に変換できません= 0xn"属性フォーマットはそれを整数として宣言します。実際にはDrawableを参照し、次のように取得する必要があります。

Drawable base = a.getDrawable(R.styleable.MyView_backgroundBase);
if( base == null ) base = BitMapFactory.decodeResource(getResources(), R.drawable.blank);

そして、これはうまくいきます。
今私の質問:
本当にTypedArrayからDrawableを取得したくありません。app:backgroundBaseに対応する整数IDが必要です(上記の例ではR.drawable.logo1)どうすれば入手できますか?

27
ilomambo

答えはそこにありました。

TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.MyView, defStyle, 0);
int base = a.getResourceId(R.styleable.MyView_backgroundBase, R.drawable.blank);
43
ilomambo