12

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

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

ID#0x101021aのリソースは、android.R.attr.listChoiceIndicatorMultipleに対応します。これは、CheckedTextViewに渡す値とまったく同じです。

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"

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

4

2 に答える 2

27

参照ではなく属性参照をプログラムで設定することが問題だと思いDrawableます。

この場合、はにandroid.R.attr.listChoiceIndicatorMultiple 対応する android.R.drawable.btn_checkので、代わりに設定してみてください。


または、属性を取得できる場合は、を呼び出しgetDrawable()て値TypedArrayを動的にフェッチできDrawableます。

編集:
の値は現在のテーマに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カスタムテーマがある場合、完全に解決するために何をする必要があるのか​​正確にはわかりません。

于 2011-01-24T18:25:16.073 に答える
1

appcompatライブラリを使用する場合、簡単な代替手段は次のようになります。

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

また:

setCheckMarkDrawable(android.support.v7.appcompat.R.drawable.abc_btn_radio_material);  
于 2016-07-02T19:48:11.560 に答える