Android.content.res.Resources $ NotFoundException при программной настройке android.R.attr.listChoiceIndicatorMultiple

Я пытаюсь программно установить атрибут «android: checkMark» в элементах CheckedTextView, которые у меня есть в ListView. При запуске моего приложения я получаю следующее исключение:

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" 

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

Я предполагаю, что проблема с программной установкой ссылки на атрибут, а не с помощью Drawable reference.

В этом случае 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);