android.content.res.Resources $ NotFoundException lors de la configuration par programmation android.R.attr.listChoiceIndicatorMultiple
-
23-10-2019 - |
Question
Je suis en train de mettre le programme « android: Checkmark » attribut sur les articles CheckedTextView j'ai dans un ListView. Lors de l'exécution de ma demande, je reçois l'exception suivante:
android.content.res.Resources$NotFoundException: Resource ID #0x101021a
La ressource avec ID # 0x101021a correspond à android.R.attr.listChoiceIndicatorMultiple , ce qui est exactement la valeur que je passe à mon CheckedTextView:
mCheckedTextView.setCheckMarkDrawable(android.R.attr.listChoiceIndicatorMultiple)
est-ce pas la façon de le faire à partir de Java? J'ai essayé (et réussi) pour déclencher le comportement souhaité dans la mise en page XML:
<CheckedTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:checkMark="?android:attr/listChoiceIndicatorMultiple"
android:id="@android:id/text1" />
La chose est que je ne sais pas au moment de la compilation si elle doit être
android:checkMark="?android:attr/listChoiceIndicatorMultiple"
ou
android:checkMark="?android:attr/listChoiceIndicatorSingle"
Par conséquent, je dois définir ces valeurs lors de l'exécution.
La solution
Je suppose que la mise en programme un attribut référence plutôt que Drawable
référence est le problème.
Dans ce cas, android.R.attr.listChoiceIndicatorMultiple
correspond à android.R.drawable.btn_check
, de sorte que vous pouvez essayer de régler ce lieu.
Ou, si vous pouvez obtenir les attributs, vous pouvez appeler getDrawable()
sur le TypedArray
pour récupérer dynamiquement la valeur de Drawable
.
Edit:
Étant donné que la valeur de listChoiceIndicatorMultiple
dépend du thème actuel, vous devez demander au thème actuel pour résoudre la référence:
int[] attrs = { android.R.attr.listChoiceIndicatorMultiple };
TypedArray ta = getContext().getTheme().obtainStyledAttributes(attrs);
Drawable indicator = ta.getDrawable(0);
view.setCheckMarkDrawable(indicator);
ta.recycle();
Assurez-vous de mettre en cache les dessinables, plutôt que d'effectuer cette manœuvre pour chaque élément de votre ListView
.
C'est juste un exemple très basique, mais il fonctionne avec le thème par défaut. Je suis si vous avez pas exactement ce qui doit être fait pour résoudre entièrement attrs
un thème personnalisé.
Autres conseils
Si vous utilisez des alternatives simples bibliothèque appcompat serait:
setCheckMarkDrawable(android.support.v7.appcompat.R.drawable.abc_btn_check_material);
ou
setCheckMarkDrawable(android.support.v7.appcompat.R.drawable.abc_btn_radio_material);