プログラムで android.R.attr.listChoiceIndicatorMultiple を設定する場合の android.content.res.Resources$NotFoundException

StackOverflow https://stackoverflow.com/questions/4783002

質問

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"

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

役に立ちましたか?

解決

プログラム的に設定すると思います 属性 参照ではなく 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 カスタムテーマがある場合は完全に。

他のヒント

AppCompatライブラリを使用する場合、簡単な代替品は次のとおりです。

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

また:

setCheckMarkDrawable(android.support.v7.appcompat.R.drawable.abc_btn_radio_material);  
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top