Android.content.res.resources $ notFoundException при программном настройке Android.R.Attr.ListChoiceIndicatorMultiple

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

Вопрос

Я пытаюсь программно установить атрибут «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);  
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top