android.content.res.Resources $ NotFoundException lors de la configuration par programmation android.R.attr.listChoiceIndicatorMultiple

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

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.

Était-ce utile?

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);  
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top