2010-08-23 17 views
7

Quiero poder recorrer todos los campos en el archivo R generado.Android: iteración programada a través de identificadores de recursos

Algo así como:

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

he intentado reflexión, pero me parece que no puede cargar una clase interna específica que está contenida dentro de la clase R. Así, por ejemplo, esto no funciona para mí:

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

puedo reflexionar sobre la propia clase I, pero necesito los campos dentro de la clase de identificación.

También intenté buscar en la clase Recursos, pero no encontré nada allí. En ese caso, parece que puede tomar un resourceID y obtener el nombre de la cadena de esa identificación, o tomar un nombre de cadena y obtener el resourceID correspondiente. No pude encontrar nada como:

int[] Resources.getAllResourceIDs() 

Tal vez estoy hablando mal de esto. O tal vez no debería luchar a escribir a todos ellos con la mano, por ejemplo .:

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

Este enfoque tiene la desventaja de no ser tan flexible cuando se trabaja con mi diseñador de interfaces. Cada vez que agrega un nuevo recurso al archivo XML, tendré que actualizar el código. Obviamente no es demasiado doloroso, pero aún sería bueno tenerlo y parece que debería ser factible.

EDIT:

La respuesta por debajo de unos ViewGroup.getChildCount()/ViewGroup.getChildAt() funciona bien. Pero, también tuve que encontrar una forma de instanciar mi XML ViewGroup/Layout. Para hacer eso, intentar algo como:

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

No estoy diciendo que esto sea sarcástico, pero en mi humilde opinión el hecho de que usted siente que necesita para hacer esta pregunta significa que probablemente está haciendo algo mal. ¿Puede explicar su caso de uso para hacer esto? Simplemente no puedo pensar en ninguna razón por la que quisiera tener acceso a todas las identificaciones definidas en toda mi aplicación. – Qberticus

+1

No deseo acceder a todos los ID, sino a todos los identificadores de recursos con un nombre determinado (por ejemplo, R.imageViewIds). De esta forma, en mi código, puedo agregar un detector de eventos o lo que sea para cada uno de ellos en uno para el ciclo.Mi UI tendrá múltiples ImageViews que responderán todos a los eventos, y sería bueno si pudiera acceder a todas esas ImageViews sin codificar manualmente cada una por su nombre (por ej. IView1.setListener (myListener); IView2.setListener (myListener);); Además, no tendré que volver a configurar mi código si mi diseñador de UI decide cambiar el nombre de las cosas en el archivo XML. –

Respuesta

5

Su respuesta a mi comentario me ayudó a tener una mejor idea de lo que está tratando de hacer.

Puede utilizar probablemente ViewGroup#getChildAt y ViewGroup#getChildCount colocar a través de diversos ViewGroup s en su jerarquía de vistas y realizar comprobaciones sobre los instanceof devueltos View s. Luego puede hacer lo que quiera dependiendo del tipo de vistas secundarias y de dónde se encuentren en su jerarquía.

+0

¡Este parece ser el boleto! Me alegro de la aclaración ayudó. No se me había pasado por la cabeza acceder a las vistas de los niños de mi diseño. Muchas gracias por la comprensión. –

+0

un ejemplo de código: http://stackoverflow.com/questions/4184889/android-refer-to-custom-views-in-a-loop/4185818#4185818 –

2

Puede utilizar la reflexión sobre una clase interna, pero la sintaxis es packagename.R $ id. Tenga en cuenta que la reflexión puede ser muy lenta y REALMENTE debe evitar usarla.

+0

Estaba pensando que el reflejo podría ser demasiado caro y no valía la pena solo por la conveniencia de no tener que codificar manualmente algunos elementos. Tenía la esperanza de que hubiera alguna forma incorporada de acceso a estos identificadores, que no estuviera basada en la relización, ya que parece una situación bastante común. Gracias, al menos, por la sintaxis al reflexionar sobre las clases internas. Es útil saber –

5

Encontré que "Class.forName (getPackageName() +". R $ string ");" puede darle acceso a los recursos de cadena y debería funcionar para id, drawable, exc también.

Luego utilizo la clase encontrado de esta manera:


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; 
    } 
} 
Cuestiones relacionadas