2016-05-12 4 views
1

J'essaie d'ajouter un tas de références pouvant être dessinées à une liste et j'ai besoin de changer le nombre dans la référence pouvant être dessinée car chacune d'entre elles fait référence à un élément différent. J'ai essayé comme suit:NumberFormatException- Invalid Int

for(int x=69;x<222;x++){ 
      urls.add(x,Integer.parseInt("R.drawable.item"+(x+1)+"_lock"); 
     } 

et en cours d'exécution, il produit une erreur NumberFormatException: java.lang.NumberFormatException: Invalid int: "R.drawable.item70_lock"

Est-ce la bonne façon d'aller sur ce que je tente de faire ou est-il une autre façon?

+0

Integer.parseInt() essaye d'obtenir une valeur d'Entier, qui est écrite dans une chaîne. Integer.parseInt ("123") renverra donc 123. Tout le R.drawable.item123 n'est rien d'autre qu'un identifiant Integer unique pour le drawable, Integer.parseInt ("R.drawable.item123") retournera dans cette exception, parce que "R.drawable.item123" n'est pas un nombre. – MojioMS

+2

Pourquoi pensez-vous que le * texte * '" R.drawable.item70_lock "' est un nombre? – Andreas

Répondre

1

get ids ressources dynamiquement:

for(int x=69;x<222;x++){ 
    int id = getResources().getIdentifier("item" + (x+1) + "_lock", "drawable", getPackageName()); 
    if(id != 0) 
     urls.add(x, id); 
} 
+0

Ceci est un anti-pattern, les ressources ne doivent pas être accessibles de cette façon. – Kelevandos

+0

lien sur l'anti-motif s'il vous plaît –

+0

Comme un article? Je n'en ai pas, je parle par expérience. Cela fonctionnera bien au début, mais introduira quelques saveurs ou logique de génération de Gradle et cela deviendra instable. Les ressources dans Android sont statiques et doivent être accessibles avec les identifiants générés statiques de la classe 'R'. – Kelevandos

0

Ce n'est pas comment fonctionnent les ressources Android :)

pointeur première ressource, est en fait un int constant, pas un String. R.drawable.item_1_lock est un champ de la classe générée automatiquement R.

Ensuite, Integer.parseInt() est utilisé pour modifier une chaîne de type numérique en un type de primitive numérique réel. Donc, si vous l'appelez avec un String param "1", ce que vous obtenez est un int avec la valeur 1.

Le problème ici est que le String que vous passez n'est pas un nombre. Il ne peut pas être transformé en nombre, donc une exception est levée. Enfin, vous ne pouvez pas générer de pointeur de ressource en cours d'exécution. Ils sont générés automatiquement et sont susceptibles de changer, vous ne devriez donc pas les générer comme ci-dessus. Créez un int[], mettez les ressources possibles dedans et obtenez-le avec le x que vous itérez dessus :-)

+0

Est-ce une idée fausse alors que la référence 'R.drawable.XXX' fait simplement référence au nom de fichier XXX? – ez4nick

+0

R. retirable.XXX est un champ statique dans la classe appelée 'R', pas un identificateur String :-) – Kelevandos

+0

Et il fait référence à la ressource appelée XXX, mais vous ne pouvez pas y accéder comme vous l'avez essayé. Pas avec une chaîne, vous devez utiliser les identifiants générés dans la classe R (qui sont des entiers générés automatiquement) – Kelevandos