Android.content.res.Resources $NotFoundException при программном настройке android.R.attr.listChoiceIndicatorMultiple
Я пытаюсь программно установить атрибут "android: checkMark" в элементах CheckedTextView, которые у меня есть в ListView. При запуске моего приложения я получаю следующее исключение:
android.content.res.Resources$NotFoundException: Resource ID #0x101021a
Ресурс с идентификатором # 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"
Следовательно, мне нужно установить эти значения во время выполнения.
Ответы
Ответ 1
Я бы предположил, что проблема с программной установкой ссылки на атрибут вместо ссылки Drawable
.
В этом случае android.R.attr.listChoiceIndicatorMultiple
соответствует android.R.drawable.btn_check
, поэтому вы можете попробовать установить это вместо этого.
Или, если вы можете получить атрибуты, вы можете вызвать getDrawable()
на TypedArray
для динамического получения значения Drawable
.
Edit:
Поскольку значение 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
, если у вас есть пользовательская тема.
Ответ 2
При использовании библиотеки appcompat простые альтернативы:
setCheckMarkDrawable(android.support.v7.appcompat.R.drawable.abc_btn_check_material);
или
setCheckMarkDrawable(android.support.v7.appcompat.R.drawable.abc_btn_radio_material);