2011-01-24 6 views
12

私はListViewにあるCheckedTextViewアイテムに "android:checkMark"属性をプログラムで設定しようとしています。私のアプリケーションを実行しているとき、私は次の例外を取得:

android.content.res.Resources$NotFoundException: Resource ID #0x101021a 

ID番号の0x101021aとリソースを正確に私は私のCheckedTextViewに渡していた値であるandroid.R.attr.listChoiceIndicatorMultipleに対応:

mCheckedTextView.setCheckMarkDrawable(android.R.attr.listChoiceIndicatorMultiple) 

これはJavaから行う方法ではありませんか?私は、XMLレイアウトから希望の動作をトリガすることを試みた(と成功):

<CheckedTextView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:checkMark="?android:attr/listChoiceIndicatorMultiple" 
    android:id="@android:id/text1" /> 

ことは、それがあるべきならば、私はコンパイル時に知っていないということです

android:checkMark="?android:attr/listChoiceIndicatorMultiple" 

または

android:checkMark="?android:attr/listChoiceIndicatorSingle" 

したがって、実行時にこれらの値を設定する必要があります。

+0

ありがとう!それは私が今日持っていた問題で多くを助けました。 – Chris

+0

@Chris:歓迎します:-) – dbm

答えて

26

私はプログラム的に属性参照ではなくDrawableの参照を設定することが問題であることを推測します。

この場合、android.R.attr.listChoiceIndicatorMultiplecorresponds toandroid.R.drawable.btn_checkですので、代わりに設定することができます。


それとも、あなたは属性を得ることができれば、あなたは動的Drawable値を取得するためにTypedArraygetDrawable()を呼び出すことができます。

編集:
listChoiceIndicatorMultipleの値は、現在のテーマに依存しているので、あなたが参照を解決するために、現在のテーマを依頼する必要があります。

int[] attrs = { android.R.attr.listChoiceIndicatorMultiple }; 
TypedArray ta = getContext().getTheme().obtainStyledAttributes(attrs); 
Drawable indicator = ta.getDrawable(0); 
view.setCheckMarkDrawable(indicator); 
ta.recycle(); 

ではなく実行するよりも、ドローアブルをキャッシュするようにしてくださいあなたのListViewのすべてのアイテムのこの操作です。

これは単なる非常に基本的な例ですが、デフォルトのテーマで動作します。カスタムテーマがある場合は、attrsを完全に解決するために何を行う必要があるか正確にはわかりません。

+0

ああ、申し訳ありません。私のせい。 – Beasly

+1

これは本当に良い答えです(私は既にその道を歩いています:-)しかし、 "android.R.drawable.btn_check" drawableがないようです。私がファイルシステムを参照すると、実際にそれを見つけることができます(それは "[path_to_android_SDK]/platforms/android-9/data/res/drawable"フォルダにあり、それはXMLファイルです)、それに応じてコードを書くとコンパイルエラーが発生します"btn_checkは解決できないか、有効なフィールドではありません"という不満があります。 – dbm

+0

しかし、もう一つの提案( "getDrawable()"に関する提案)は私にとって初めてのものです。しかし、私はその前にそのような操作をしていないので、それでいくつかの "宿題"をしなければならないだろう:-) – dbm

0

APPCOMPATライブラリを使用している場合、単純な選択肢は次のようになります。

setCheckMarkDrawable(android.support.v7.appcompat.R.drawable.abc_btn_check_material); 

か:

setCheckMarkDrawable(android.support.v7.appcompat.R.drawable.abc_btn_radio_material); 
関連する問題