20

を使用描画可能参照用のリソースIDを取得し、私はいくつかのカスタム属性を定義します。このカスタムビュー<code>MyView</code>を持つスタイル付き属性に

<?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を取得する必要はありません、私は(それがR.drawable.logo1だろう上記の例では)app:backgroundBaseに対応する整数IDを望みます。どうすれば入手できますか?

答えて

36

それは、答えはすぐそこだったことが判明:

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

私を助けてくれただろういくつかの明確化: 'R.drawable.blank'は、要求が存在しない場合のデフォルトのリソースです – HaydenKai

関連する問題