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.png
… icon_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
- Problema al analizar JSON
- No se puede escribir en el campo de entrada después de cargar una página con InAppBrowser y la carga del hilador
- Detección de frecuencia / tono para maniquíes
- ¿Cómo mantener un ScrollView desplazado hacia abajo?
- Android - No se puede obtener la ubicación del GPS en el emulador
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?
- ¿Cómo crear una biblioteca nativa de C ++ en Android?
- Android OpenCV Mejora de la calidad de detección
- Creación de Release-Debug para aplicación Android
- Evitar que la dependencia de Gradle para la biblioteca de soporte sea reemplazada por una versión más reciente
- Pestañas de Viewpager Fragmento y Fragmentos normales
- Java.io.IOException: write failed: EPIPE (Broken pipe)
- ¿Cómo puedo ejecutar esta clase en el hilo de interfaz de usuario?
- ListFragment Biblioteca de soporte GetSupportFragmentManager undefined
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!