Android.content.res.resources $ notFoundException при программном настройке Android.R.Attr.ListChoiceIndicatorMultiple
-
23-10-2019 - |
Вопрос
Я пытаюсь программно установить атрибут «Android: Checkmark» на элементах CheckedTextView, которые у меня есть в ListView. При запуске моего приложения я получаю следующее исключение:
android.content.res.Resources$NotFoundException: Resource ID #0x101021a
Ресурс с ID #0x101021A соответствует Android.r.attr.listChoiceIndicatormultiple, что именно то значение, которое я передаю в свой FectedTextView:
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);