2010-08-23 11 views
7

Voglio essere in grado di scorrere tutti i campi nel file R generato.Android: iterazione programmata tramite ID risorsa

Qualcosa di simile:

for(int id : R.id.getAllFields()){ 
//Do something with id, like create a view for each image 
} 

ho provato riflessione, ma io non riesco a caricare una classe interna specifico che è contenuto all'interno della classe R. Così, per esempio, questo potrebbe non funzionare per me:

Class c = Class.forName("packageName.R.id") 

posso riflettere sulla classe R in sé, ma ho bisogno di campi all'interno della classe id.

Ho anche provato a cercare nella classe Risorse, ma non ho trovato nulla lì. In quel caso, sembra che tu possa prendere un resourceID e ottenere il nome della stringa di quell'id, o prendere un nome di stringa e ottenere il resourceID corrispondente. Non ho trovato nulla di simile:

int[] Resources.getAllResourceIDs() 

Forse sto andando su questo sbagliato. O forse non dovrei combattere tutti digitando a mano, ad es .:

int[] myIds = {R.id.firstResource, R.id.secondResource} 

Questo approccio ha lo svantaggio di non essere il più flessibile quando si lavora con la mia UI designer. Ogni volta che aggiunge una nuova risorsa al file XML, dovrò aggiornare il codice. Ovviamente non troppo doloroso, ma sarebbe comunque bello avere e sembra che dovrebbe essere fattibile.

EDIT:

La risposta di sotto di circa ViewGroup.getChildCount()/ViewGroup.getChildAt() funziona bene. Ma dovevo anche trovare un modo per istanziare il mio XML ViewGroup/Layout. Per fare questo, provare qualcosa di simile:

LayoutInflater li = MyActivity.getLayoutInflater(); 
ViewGroup vg = (ViewGroup) li.inflate(R.layout.main, null); 
+0

Non sto dicendo questo per essere snarky, ma secondo me il fatto che ti senti bisogno di fare questa domanda significa probabilmente stai facendo Qualcosa non va. Puoi approfondire il tuo caso d'uso per farlo. Non riesco a pensare a nessun motivo per cui vorrei avere accesso a tutti gli ID definiti durante tutta la mia intera applicazione. – Qberticus

+1

Non voglio accedere a tutti gli ID, ma piuttosto a tutti gli ID delle risorse sotto un certo nome (ad esempio R.imageViewIds). In questo modo, nel mio codice, posso aggiungere un listener di eventi o qualsiasi cosa a ciascuno di essi in un ciclo for.La mia interfaccia utente avrà più di ImageViews che risponderanno agli eventi e sarebbe bello poter accedere a tutte quelle ImageViews senza la codifica manuale per nome (ad esempio IView1.setListener (myListener); IView2.setListener (myListener) Inoltre, non sarà necessario rifattorizzare il mio codice se il progettista dell'interfaccia utente decide di rinominare le cose nel file XML. –

risposta

5

La tua risposta al mio commento mi ha aiutato ad avere un'idea migliore di ciò che stai cercando di fare.

Probabilmente si può usare ViewGroup#getChildAt e ViewGroup#getChildCount a ciclo attraverso vari ViewGroup s nella gerarchia visualizzare ed eseguire instanceof controlli sulle restituiti View s. Quindi puoi fare tutto ciò che vuoi a seconda del tipo di visualizzazioni figlio e di dove si trovano nella tua gerarchia.

+0

Questo sembra essere il biglietto! Sono contento che il chiarimento sia stato d'aiuto. Non avevo attraversato la mia mente per accedere alle visioni dei bambini sul mio layout. Grazie mille per l'intuizione. –

+0

un esempio di codice: http://stackoverflow.com/questions/4184889/android-refer-to-custom-views-in-a-loop/4185818#4185818 –

2

È possibile utilizzare la riflessione su una classe interna, ma la sintassi è packagename.R $ id. Si noti che la riflessione può essere molto lenta e si dovrebbe assolutamente evitare di usarla.

+0

Stavo pensando che la riflessione potrebbe essere troppo costosa, e non ne vale la pena solo per la comodità di non dover codificare manualmente alcuni elementi. Speravo che esistesse un modo integrato per accedere a questi id, non basato sulla relifica, poiché sembra uno scenario abbastanza comune. Grazie, almeno, per la sintassi sulla riflessione sulle classi interne. È utile saperlo. –

5

Ho trovato che "Class.forome (getPackageName() +". R $ stringa ");" può darti accesso alle risorse stringa e dovrebbe funzionare per id, drawable, exc pure.

Ho quindi utilizzare la classe trovato in questo modo:


import java.lang.reflect.Field; 

import android.util.Log; 

public class ResourceUtil { 

    /** 
    * Finds the resource ID for the current application's resources. 
    * @param Rclass Resource class to find resource in. 
    * Example: R.string.class, R.layout.class, R.drawable.class 
    * @param name Name of the resource to search for. 
    * @return The id of the resource or -1 if not found. 
    */ 
    public static int getResourceByName(Class<?> Rclass, String name) { 
     int id = -1; 
     try { 
      if (Rclass != null) { 
       final Field field = Rclass.getField(name); 
       if (field != null) 
        id = field.getInt(null); 
      } 
     } catch (final Exception e) { 
      Log.e("GET_RESOURCE_BY_NAME: ", e.toString()); 
      e.printStackTrace(); 
     } 
     return id; 
    } 
} 
Problemi correlati