2010-01-24 11 views
5

Tengo una larga serie de gráficos: icon1_0.png, icon1_1.png, icon1_2.png ..., icon12_0.png, icon12_1.png, icon12_2.png - y yo ' Me gusta empaquetarlos con mi aplicación de Android. Idealmente, creo que debería poder cargarlos como recursos, pero los identificadores de recursos están configurados como identificadores java. Por supuesto, los identificadores java no se pueden ensamblar en tiempo de ejecución. Tengo que pedir R.drawable.icon12_00 así que no puedo configurar un bucleLote obteniendo muchos recursos de mapa de bits en Android

for(int icon=0;icon<12;icon++) 
for(int frame=0;frame<3;frame++) 
    //syntax error obviously 
    BitmapFactory.decodeResource(getResources(), R.drawable."icon" + icon + "_" + frame + ".png"); 

Entonces, ¿hay alguna manera de obtener recursos por sus nombres? Mejor aún, ¿hay una forma canónica fuera del sistema de recursos para empacar los archivos de datos en un paquete de aplicaciones de Android para poder acceder a ellos?

Estoy pensando en la reflexión, pero esa no parece ser la solución adecuada para mí.

Respuesta

13

Use getResources().getIdentifier() desde su Context (por ejemplo, Activity), pero guarde en caché el resultado si lo va a usar más de una vez. getIdentifier() se implementa en Resources.

+0

Bien, esto funciona. getIdentifier ("resname", "restype", "com.domain.appname"); Gracias. – Brian

+1

En lugar de pasar el nombre del paquete como valor estático, puede usar 'getPackageName()' –

6

Sé que ya ha encontrado una respuesta, pero si utiliza el reflejo, verá un buen aumento de velocidad, ya que getIdentifier() es más lento. Escribí sobre cómo hacer el método de reflexión here. Sin embargo, esto solo funciona si está accediendo a sus propios recursos.

+0

¿Qué tal eso. Esto es un poco más rápido. Es una pena, sin embargo, porque el reflejo es notoriamente obsceno, por lo que getIdentifier debe ser un monstruo lento. – Brian

2

La reflexión también es muy lenta, solo debe crear una matriz con todos sus identificadores en ella.

+2

¿Quiere decir, simplemente escriba todo el bucle en el código? ¿O algo más inteligente? Me interesaría lo último, porque sería un buen aumento de velocidad si pudiera obtener un recurso incluso más rápido que usando la reflexión (pero esto sería en una circunstancia ligeramente diferente, donde los datos de la aplicación se refieren a los recursos, no al código). . –

+0

@DanielLew, él dice que tiene un generador de código que escribe todo el bucle en código para usted – Pacerier

Cuestiones relacionadas