Acceso a variables por nombre en un bucle

Estoy trabajando en un proyecto de Android, y tengo un montón de drawables. Estos elementos se denominan icon_0.png , icon_1.pngicon_100.png . Quiero agregar todos los identificadores de recursos de estos drawables a un ArrayList de enteros. (Para aquellos que no conocen android, sólo Java, estoy hablando de variables estáticas, en una clase interna estática de una clase, como R.drawable.icon_0 . Todas estas variables estáticas son enteros.)

¿Hay una manera más eficiente de hacer esto, que agregándolos uno por uno? Me gusta

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

¿Puedo pasar por ellos de alguna manera? Me gusta

 for(int i=0; i<100; i++) { list.add(R.drawable.icon_+i); //<--- I know this doesn't work. } 

No tengo ningún control sobre el archivo donde están estos enteros estáticos, y no puedo crear los drawables en tiempo de ejecución.

¡Cualquier ayuda sería apreciada!

EDITAR

Bueno, leo las respuestas, pero tengo un problema importante: No tengo acceso a ninguna instancia de Context en la que necesito crear esta matriz / lista de ids (lo hago en un bloque de inicializador estático), así que getResources ) Método, lo que dos de las respuestas sugeridas no funcionará. ¿Hay otra manera de hacer esto?

Una forma sería usar API de reflexión.

Algo a lo largo de las líneas …

 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"); 

No he probado esto, pero tienes la idea.

Cree un archivo XML en la carpeta de values de su directorio de 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> 

Ir a través del siguiente código, obtendrá la idea.

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

Usted puede intentar esto. YourClassName.class.getFields();

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

Usted puede iterar todos los campos, y usted puede necesitar filtrarlo si u tiene campos adicionales que usted necesita.

Esto es lo que acabé haciendo:

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

Estoy seguro de que no es la forma más rápida, pero está funcionando. Acepto la solución de AljoshaBre, porque su respuesta me llevó a esta solución.

¡Gracias a todos por su ayuda!

  • La regla de la lechada personalizada no aparece en el estudio de eclipse / android
  • Leer y escribir un ArrayList de ArrayLists que contiene Objetos parcelables para pasar en un intento
  • Escribir una aplicación Java portátil utilizando JOGL y Android OpenGL
  • Borrar edittext enfocar y ocultar el teclado cuando se pulsa el botón
  • Android obtiene diferencia en milisegundos entre dos fechas
  • ¿Qué debe ser el JID para un usuario en OpenFire Server?
  • ¿Cómo se inyecta impl de alguna interfaz en una actividad de Android utilizando Guice
  • Error: Error de ejecución para la tarea ': app: shrinkReleaseMultiDexComponents'
  • Comunicación entre servicio y actividad en una aplicación android mediaplayer
  • Cómo ordenar la fecha en orden descendente De Arraylist Fecha en android?
  • Solicitud de permiso de cámara con Android SDK 23
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.