2011-01-24 2 views
12

J'essaie de définir par programme l'attribut "android: checkMark" sur les éléments CheckedTextView que 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) 

N'est-ce pas la façon de le faire à partir de Java? J'ai essayé (et réussi) pour déclencher le comportement souhaité de 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, j'ai besoin de définir ces valeurs lors de l'exécution.

+0

Merci! Cela m'a aidé beaucoup avec un problème que j'ai eu aujourd'hui. – Chris

+0

@Chris: Vous êtes les bienvenus :-) – dbm

Répondre

26

Je suppose que la mise en un programme plutôt qu'une référence Drawable référence attribut est le problème.

Dans ce cas, android.R.attr.listChoiceIndicatorMultiplecorresponds toandroid.R.drawable.btn_check, vous pouvez donc essayer de le définir à la place.


Ou, si vous pouvez obtenir les attributs, vous pouvez appeler getDrawable() sur le TypedArray chercher dynamiquement la valeur Drawable.

Edit:
Puisque 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 article de votre ListView.

C'est juste un exemple très basique, mais cela fonctionne avec le thème par défaut. Je ne suis pas exactement sûr de ce qui doit être fait pour résoudre complètement attrs si vous avez un thème personnalisé.

+0

Oh désolé, vous avez raison. Ma faute. – Beasly

+1

C'est une très bonne réponse (puisque j'ai déjà parcouru ce chemin :-), cependant, il semble qu'il n'y ait pas de dessinable "android.R.drawable.btn_check".Si je navigue sur le système de fichiers je le trouve en effet (c'est dans le dossier "[path_to_android_SDK]/platform/android-9/data/res/drawable" et c'est un fichier XML), mais en écrivant mon code en conséquence je compile les erreurs se plaindre de "btn_check ne peut pas être résolu ou n'est pas un champ valide". – dbm

+0

L'autre suggestion (celle sur "getDrawable()") est cependant nouvelle pour moi. Je vais devoir faire quelques "devoirs" sur celui-là, puisque je n'ai pas fait une telle manœuvre avant :-) – dbm

0

Si vous utilisez les alternatives simples bibliothèque appcompat seraient:

setCheckMarkDrawable(android.support.v7.appcompat.R.drawable.abc_btn_check_material); 

ou:

setCheckMarkDrawable(android.support.v7.appcompat.R.drawable.abc_btn_radio_material); 
Questions connexes