2016-05-12 13 views
1

Ich versuche, eine Reihe von ziehbaren Referenzen zu einer Liste hinzuzufügen, und ich muss die Nummer in der ziehbaren Referenz ändern, da jeder auf ein anderes Element verweist. Ich habe versucht, haben sich wie folgt:NumberFormatException - Invalid Int

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

und beim Laufen erzeugt er ein NumberFormatException Fehler: java.lang.NumberFormatException: Invalid int: "R.drawable.item70_lock"

Ist dies der richtige Weg zu gehen, was ich versucht habe zu tun, oder gibt es eine andere Art und Weise?

+0

Integer.parseInt() versucht, einen Integer-Wert zu erhalten, dass in einem String geschrieben wird. Integer.parseInt ("123") gibt daher 123 zurück. Alles in allem ist das R.drawable.item123 nichts anderes als eine eindeutige Integer-ID für das Zeichen, Integer.parseInt ("R.drawable.item123") wird in dieser Ausnahme zurückgegeben, weil "R.drawable.item123" keine Nummer ist. – MojioMS

+2

Warum denkst du, dass * text * '" R.drawable.item70_lock "' eine Zahl ist? – Andreas

Antwort

1

get Ressourcen-IDs dynamisch:

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

Dies ist ein Anti-Pattern, Ressourcen sollten nicht auf diese Weise zugegriffen werden. – Kelevandos

+0

Link auf dem Anti-Muster bitte –

+0

Wie ein Artikel? Ich habe keine, ich spreche aus Erfahrung. Dies wird zuerst funktionieren, aber einige Geschmacksrichtungen oder Gradle Generation Logik einführen und es wird instabil werden. Ressourcen in Android sind statisch und sollten mit den statischen, generierten Bezeichnern aus der 'R'-Klasse aufgerufen werden. – Kelevandos

0

Dies ist nicht, wie Android Ressourcen Arbeit :)

Zuerst Ressourcenzeiger tatsächlich eine Konstante int ist, kein String. R.drawable.item_1_lock ist ein Feld in der automatisch generierten Klasse R.

Zweitens, Integer.parseInt() wird verwendet, um eine Zahl-wie String in eine tatsächliche Anzahl primitiven Typ zu ändern. Also, wenn Sie es mit einem String Parameter "1" aufrufen, was Sie erhalten, ist ein Int mit Wert 1.

Das Problem hier ist, dass die String Sie übergeben ist nicht zahlenähnlich. Es kann nicht in eine Zahl umgewandelt werden, daher wird eine Ausnahme ausgelöst.

Schließlich können Sie in Runtime keinen Ressourcenzeiger generieren. Sie werden automatisch generiert und sind anfällig für Änderungen, daher sollten Sie sie nicht wie oben beschrieben generieren. Erstellen Sie eine int[], legen Sie die möglichen Ressourcen in sie und bekommen es mit der x Sie iterieren auf :-)

+0

Ist es ein Missverständnis, dass sich der Verweis 'R.drawable.XXX' nur auf den Dateinamen XXX bezieht? – ez4nick

+0

R.drawable.XXX ist ein statisches Feld in der Klasse 'R', kein String-Bezeichner :-) – Kelevandos

+0

Und es bezieht sich auf die Ressource namens XXX, aber Sie können nicht darauf zugreifen, wie Sie es versucht haben. Nicht mit einem String, müssen Sie die Bezeichner in der R-Klasse generiert (die automatisch generierten Ints) – Kelevandos