2012-08-05 18 views
8

Ich arbeite an einem Android-Projekt, und ich habe viele Zeichen. Diese Zeichen sind alle wie icon_0.png, icon_1.png ... icon_100.png benannt. Ich möchte alle Ressourcen-IDs dieser Zeichenobjekte zu einer ArrayList von Ganzzahlen hinzufügen. (Für diejenigen, die Android nicht kennen, nur Java, ich spreche über statische Variablen, in einer statischen inneren Klasse einer Klasse, wie R.drawable.icon_0. Alle diese statischen Variablen sind Ganzzahlen.)Zugriff Variablen nach Namen in einer Schleife

Gibt es eine effizientere Weg, dies zu tun, als sie eins nach dem anderen hinzuzufügen? Wie

ArrayList<Integer> list = new ArrayList<Integer>(); 
list.add(R.drawable.icon_1); 
list.add(R.drawable.icon_2); 
... 
list.add(R.drawable.icon_100); 

Kann ich sie irgendwie durchschleifen? Wie

Ich habe keine Kontrolle über die Datei, wo diese statischen Ganzzahlen sind, und ich kann die Zeichen in der Laufzeit nicht erstellen.

Jede Hilfe wäre willkommen!

EDIT

Okay, ich lese die Antworten, aber ich habe ein großes Problem: Ich habe keinen Zugriff auf irgendwelche Context Fälle, in denen ich dieses Array/Liste von IDs erstellen müssen (ich es tun in einem statischen initialzer-Block), also die Methode getResources(), welche zwei der vorgeschlagenen Antworten nicht funktionieren. Gibt es einen anderen Weg, dies zu tun?

+0

http://stackoverflow.com/questions/2414134/dynamicly-get-drawables-by-id –

Antwort

0

Ein Weg wäre, Reflection API zu verwenden.

Etwas nach dem Vorbild ...

Field[] fields = R.drawable.class.getFields(); 
List<String> names = new ArrayList<String>(); 
for (Field field : fields) { 
    if(field.getName().startsWith("icon")) 
     names.add(field.getName());  
} 

int resid = getResources().getIdentifier(names.get(0), "drawable", "com.org.bla"); 

ich nicht getestet haben, aber Sie bekommen die Idee.

+1

Schlechte Idee ... IMO. –

+0

Ich würde gerne wissen, warum genau ... – nullpotent

+0

@AljoshaBre Weil Reflexion wirklich langsam ist * (vor allem auf Dalvik) *. Du kannst damit davonkommen, ein oder zwei Residents zu bekommen. In diesem Fall sprechen wir von 100.Wenn ich mich richtig erinnere, verwendet 'getIdentifier()' intern auch Reflektion, was die Dinge nicht besser macht. Sehen Sie sich [diese Frage] an (http://stackoverflow.com/questions/5492236/why-does-reflection-slow-down-android-phone) und das [darin verlinkte] (http: // stackoverflow. com/questions/435553/java-reflection-performance). Obwohl ich sagen würde messen und eigene Entscheidungen treffen. Es klingt nur * wie eine schlechte Idee aus meiner Erfahrung. –

3

Sie können dies versuchen. YourClassName.class.getFields();

Field[] fields = R.drawable.class.getFields();

können Sie alle Felder durchlaufen, und Sie können es filtern müssen, wenn u zusätzliche Felder haben, als Sie benötigen.

4

Erstellen Sie eine XML-Datei im Ordner values in Ihrem Verzeichnis resource.

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
<array name="myIcons"> 
    <item>@drawable/icon1</item> 
    <item>@drawable/icon2</item> 
    <item>@drawable/icon3</item> 
    <item>@drawable/icon4</item> 
    <item>@drawable/icon5</item> 
    ... 
    ... 
</array> 
</resources> 

Gehen Sie durch den folgenden Code, erhalten Sie die Idee.

Resources res = getResources(); 
TypedArray myIcons= res.obtainTypedArray(R.array.myIcons); //mentioned in the XML 
for(int i=0; i<100; i++) 
{ 
    Drawable drawable = myIcons.getDrawable(i); 
    list.add(drawable); 
} 
+0

Dies ist die richtige Lösung. Reflexion ist bei weitem der schlechteste Weg, dies zu tun. – Falmarri

+2

@Falmarri Pflege, warum zu erklären? – nullpotent

+0

Hallo! Danke für die Antwort, ich mag es wirklich. Mein einziges Problem ist (ich habe es in der Frage nicht erwähnt), dass die Liste, die ich erstellen muss, ein statisches Feld ist, und ich kann es nur in einen statischen Initialisierungsblock hochladen, wo ich keinen Zugriff auf irgendwelche Kontext-Instanzen habe. Irgendwelche Ideen in diesem Fall? :( –

0

Hier ist, was ich tun endete:

icons = new ArrayList<Integer>(100); 

//get all the fields of the R.drawable class.  
Field [] fields = R.drawable.class.getDeclaredFields(); 

//create a temporary list for the names of the needed variables. 
ArrayList <String> names = new ArrayList<String>(100); 

//select only the desired names. 
for(int i=0; i<fields.length; i++) 
    if(fields[i].getName().contains("icon_")) 
     names.add(fields[i].getName()); 

//sort these names, because later i want to access them like icons.get(0) 
//what means i want icon_0. 
Collections.sort(names); 

try 
{ 
    for(int i=0; i<names.size(); i++) 
    { 
     //get the actual value of these fields, 
     //and adding them to the icons list. 
     int id = R.drawable.class.getField(names.get(i)).getInt(null); 
     icons.add(id); 
    } 
} 
catch(Exception ex) 
{ 
    System.out.println(ex.getMessage()); 
} 

Ich bin sicher, dass es nicht der schnellste Weg ist, aber es funktioniert. Ich werde die Lösung von AljoshaBre akzeptieren, denn seine Antwort hat mich zu dieser Lösung geführt.

Vielen Dank für die Hilfe!

+0

Nun, okay, aber ich hoffe Sie kennen alle Vor- und Nachteile der Verwendung von Reflection API auf Dalvik. – nullpotent

+0

Es ist das zweite oder dritte Mal, ich sehe die Reflexion API in Aktion, so dass ich keine Ahnung habe über die Vorteile/Nachteile, und ich nicht einmal wissen, was Dalvik bedeutet. Ich wollte einfach nicht die xml-Methode verwenden, weil ich genauso viel eingeben musste, wie manuell die ids zur Liste hinzufügend. Könnten Sie bitte einige Quellen über die Reflection-Sachen zur Verfügung stellen? –

Verwandte Themen