Подтвердить что ты не робот

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"

Следовательно, мне нужно установить эти значения во время выполнения.

4b9b3361

Ответ 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);