2010-05-10 10 views
11

Estoy trabajando en una aplicación para Android con algunas otras personas, y nuestros diseñadores especifican el contenido principal como archivos de texto en un determinado formato de archivo, que luego analizamos , procesar y servir en la aplicación. Actualmente los estamos almacenando en res/raw.Acceder a los contenidos de res/raw programatically (Android)

Esto hace las cosas bien para los diseñadores porque cuando quieren agregar contenido, simplemente agregan un archivo al res/raw. Sin embargo, esto es molesto como desarrollador, ya que los desarrolladores necesitamos agregar R.raw.the_new_file a una matriz en el código que especifica qué archivos procesar al inicio.

¿Hay alguna manera de acceder a los ID de recursos de res/raw programáticamente? Idealmente, cuando se inicie la aplicación, podríamos hacer una llamada para ver qué archivos están en res/raw, procesarlos todos, para poder eliminar la pequeña sobrecarga con la coincidencia de los contenidos de res/raw con los de nuestra matriz en el código.

El camino más prometedor que he visto es getAssets de Resources, lo que permitiría que llame a list(String) en el AssetManager, pero he tenido problemas para conseguir que esto funcione, sobre todo porque no se puede llamar directamente "res/raw" como su ruta al archivo (o al menos, no ha funcionado cuando lo he intentado.

Sugerencias? Gracias

Respuesta

15

Podría usar el reflejo.


ArrayList<Integer> list = new ArrayList<Integer>(); 
Field[] fields = R.raw.class.getFields(); 
for(Field f : fields) 
try { 
     list.add(f.getInt(null)); 
    } catch (IllegalArgumentException e) { 
    } catch (IllegalAccessException e) { } 

Después de esa lista se guardan todos los ID de recursos en la carpeta res/raw. Si necesita el nombre del recurso ... f.getName() lo devuelve.

+0

Gracias, hasta tarde para aceptar, pero había olvidado que no. ¡Trabajado como un encanto! –

1

usted podría utilizar

Context.getResources().getIdentifier("filename", "raw", "packagename"); 

para obtener la i apropiada dentífrico sin embargo, no entiendo por qué implementas tu solución que es complicado? ¿Cuáles son las ventajas para el diseñador? ¿Por qué no solo ponen los archivos en una carpeta dibujable?

+0

Esto no es para gráficos, sino para niveles en un juego. Cada nivel tiene un mapa estático, una cantidad variable de objetos dinámicos, ubicaciones para esos objetos, notificaciones específicas de nivel, varias configuraciones, etc. En lugar de hacer que los diseñadores de niveles editen directamente nuestra base de código, escribimos un analizador para permitirles especifica los niveles declarativamente en archivos de texto; y elegimos ponerlos en res/raw. ¡Gracias por el consejo! Voy a intentarlo y dejarte saber cómo va^_^ –

5

Esta respuesta puede ser un poco tarde, en su lugar debe usar la carpeta de activos. Allí puede tener una jerarquía de carpetas y leerla como un sistema de archivos.

Para su información, getAssets devuelve un administrador para los archivos en la carpeta "assets" de su proyecto Android y no en "res/raw". "res/raw" entra en el paquete "R" de Java. assets.list(path) Devuelve una matriz de archivos en la carpeta dada relativa a su carpeta de activos. La carpeta del activo tampoco es una carpeta tradicional, pero Android la abstrae para que "se sienta" como los archivos normales. Esto se vuelve más importante si está haciendo JNI y quiere leer sus activos de c/C++.

Cuestiones relacionadas