android.content.res.Resources $ NotFoundException以编程方式设置android.R.attr.listChoiceIndicatorMultiple

时间:2011-01-24 14:18:08

标签: android listviewitem checkedtextview

我正在尝试以编程方式在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"

因此,我需要在运行时设置这些值。

2 个答案:

答案 0 :(得分:26)

我猜想以编程方式设置属性引用而不是 Drawable 引用是问题所在。

在这种情况下,android.R.attr.listChoiceIndicatorMultiple corresponds to android.R.drawable.btn_check,您可以尝试设置它。


或者,如果您可以获取属性,则可以在TypedArray上调用getDrawable()来动态获取Drawable值。

修改
由于listChoiceIndicatorMultiple的值取决于当前主题,因此您需要询问当前主题以解析引用:

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

请务必缓存drawable,而不是为ListView中的每个项目执行此操作。

这只是一个非常基本的例子,但它适用于默认主题。如果您有自定义主题,我不完全确定要完全解决attrs需要做什么。

答案 1 :(得分:0)

如果使用appcompat库,简单的替代方法是:

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

或:

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