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 回答