29 05 2009

Astuce du jour Android : récupérer dynamiquement une ressource

Petite astuce si comme moi vous cherchez à récupérer dynamiquement une ressource (drawable, color…) en connaissant son nom…

Mon besoin est simple, la solution aussi…

Sur métroide (mon application de calcul d’itinéraire de metro pour Android), j’ai un grand nombre d’images pour toutes les lignes du métro (+rer et tram) que je dois afficher dynamiquement sur l’itinéraire.

Comme un exemple vaut mille paroles, exemple :
J’ai l’itinéraire suivant : nation (”m1″: ligne 1 du métro), porte d’italie (”m7″).
Je vais donc avoir besoin des images R.drawable.m1 et R.drawable.m7. Mais je n’ai qu’une chaine de caractère pour spécifier le nom de l’image. J’aurais aimé faire un truc du genre R.drawable["m1"] ou R.drawable.get(”m7″)… mais malheureusement, ce n’est pas possible. Je dois avouer que pour le concours SFRJTD, je n’ai pas poussé plus loin mes recherches et j’ai fait un switch en découpant ma chaine (m1 -> m et 1, donc m me dit metro, 1 ligne 1, je prend donc R.drawable.m1)… berk !

Cette solution ne me convenant pas et n’ayant pas trouvé de réponse à ma question, je me suis dit : “tant qu’a faire crade, pourquoi ne pas faire de l’introspection ?” Et c’est comme ca que j’ai réduit un switch de 40 lignes en 5 lignes comme ceci :

try {
	Field f = R.drawable.class.getField(line); // line = "m1" ou "rb" ou "t3"...
	return f.getInt(null); // class static et champs static dans R, on peut laisser à null
} catch (Exception e) {
	return R.drawable.empty;
}

Je ne suis pas encore complètement convaincu et je me dis que j’ai du me prendre la tête à faire compliqué alors que c’est prévu dans le SDK. Si tel est le cas, je suis preneur de vos solutions…

1 Comment

Romain B.août 11th, 2009 at 17:56

Merci pour cette astuce. J’avais pour ma part utilisé une map qui associait une chaine à une ressource, mais ça ne me convenait pas non plus.

Et au passage, merci aussi pour metroid…

Leave a comment

Your comment

CAPTCHA image