Android: Programar iterar a través de ID de recursos

Quiero ser capaz de iterar a través de todos los campos en el archivo R generado.

Algo como:

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

He intentado la reflexión, pero no puedo cargar una clase interna específica que esté contenida dentro de la clase de R. Así, por ejemplo, esto no funcionaría para mí:

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

Puedo reflexionar sobre la clase R misma, pero necesito los campos dentro de la clase id.

También intenté mirar a través de la clase Recursos, pero no pude encontrar nada allí. En ese caso, parece que puede tomar un resourceID y obtener el nombre de cadena de ese id, o tomar un nombre de cadena y obtener el resourceID correspondiente. No pude encontrar nada como:

 int[] Resources.getAllResourceIDs() 

Tal vez estoy haciendo esto mal. O tal vez no debería luchar escribiendo todos ellos a 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 interfaz de usuario. Cada vez que añade un nuevo recurso al archivo XML, tendré que actualizar el código. Obviamente no demasiado doloroso, pero todavía sería agradable tener y parece que debe ser factible.

EDITAR:

La respuesta a continuación sobre ViewGroup.getChildCount () / ViewGroup.getChildAt () funciona correctamente. Pero, también tuve que encontrar una manera de instanciar mi XML ViewGroup / Layout. Para ello, pruebe algo como:

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

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

Probablemente puede utilizar ViewGroup#getChildAt y ViewGroup#getChildCount para realizar bucle a través de varios ViewGroup s en su jerarquía de vistas y realizar instanceof verificaciones en la View devuelta. A continuación, puede hacer lo que quiera dependiendo del tipo de vistas de los niños y de dónde se encuentren en su jerarquía.

Encontré que "Class.forName (getPackageName () +". R $ string ");" Puede darle el acceso a los recursos de la secuencia y debe trabajar para la identificación, drawable, exc también.

A continuación, utilizar la clase se encuentra así:


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

Puede utilizar la reflexión en una clase interna, pero la sintaxis es packagename.R $ id. Tenga en cuenta que la reflexión puede ser muy lento y que realmente debe evitar el uso de ella.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.