2010-01-24 8 views
5

J'ai une longue série de graphiques - icon1_0.png, icon1_1.png, icon1_2.png ..., icon12_0.png, icon12_1.png, icon12_2.png - et je ' J'aimerais les emballer avec mon application Android. Idéalement, je pense que je devrais être capable de les charger en tant que ressources, mais les identifiants de ressources sont configurés comme des identifiants java. Bien sûr, les identifiants java ne peuvent pas être assemblés lors de l'exécution. Je dois demander R.drawable.icon12_00 donc je ne peux pas mettre en place une boucleBatch obtenant de nombreuses ressources bitmap sur Android

for(int icon=0;icon<12;icon++) 
for(int frame=0;frame<3;frame++) 
    //syntax error obviously 
    BitmapFactory.decodeResource(getResources(), R.drawable."icon" + icon + "_" + frame + ".png"); 

Ainsi est-il possible d'obtenir des ressources par leur nom? Mieux encore, existe-t-il un moyen canonique en dehors du système de ressources pour emballer les fichiers de données dans un paquet d'application android afin que je puisse y arriver?

Je pense à la réflexion mais cela ne me semble pas être la bonne solution.

Répondre

13

Utilisez getResources().getIdentifier() à partir de votre Context (par exemple, Activity), mais veuillez mettre en cache le résultat si vous souhaitez l'utiliser plusieurs fois. getIdentifier() est implémenté sur Resources.

+0

D'accord, cela fonctionne. getIdentifier ("resname", "restype", "com.domain.appname"); Je vous remercie. – Brian

+1

Au lieu de passer le nom du paquet en tant que valeur statique, vous pouvez utiliser 'getPackageName()' –

6

Je sais que vous avez déjà trouvé une réponse, mais si vous utilisez la réflexion, vous verrez une bonne augmentation de la vitesse, car getIdentifier() est plus lent. J'ai écrit sur la façon de faire la méthode de réflexion here. Cependant, cela ne fonctionne que si vous accédez à vos propres ressources.

+0

Que diriez-vous de cela. C'est un peu plus rapide. C'est dommage, cependant, parce que la réflexion est notoirement pokey alors getIdentifier doit être monstre lent. – Brian

2

La réflexion est également très lente, vous devriez juste créer un tableau avec tous vos identifiants dedans.

+2

Voulez-vous dire, il suffit d'écrire toute la boucle dans le code? Ou quelque chose de plus intelligent? Je m'intéresserais à ce dernier, car ce serait un bon coup de pouce si je pouvais obtenir une ressource encore plus rapidement que d'utiliser la réflexion (mais dans une situation légèrement différente, où les données de l'application font référence aux ressources - pas au code) . –

+0

@DanielLew il dit que vous avez un générateur de code qui écrit toute la boucle dans le code pour vous – Pacerier

Questions connexes