¿El directorio elaborable de Android puede contener subdirectorios?

En la documentación de SDK de Android, todos los ejemplos utilizados con la sintaxis @ drawable / my_image xml direccionan directamente las imágenes que se almacenan en el directorio res / drawable de mi proyecto.

Me pregunto si explícitamente no está bien crear un subdirectorio dentro del directorio dibujable.

Por ejemplo, si tuviera el siguiente diseño de directorio:

res/drawable -- sandwiches -- tunaOnRye.png -- hamAndSwiss.png -- drinks -- coldOne.png -- hotTea.png 

¿Podría referirme a la imagen de un sándwich de ensalada de atún como @ drawable / sandwiches / tunaOnRye

¿O tengo que mantener la jerarquía plana en el directorio dibujable.

No, el mecanismo de recursos no admite subcarpetas en el directorio dibujable, por lo que sí, es necesario mantener esa jerarquía plana.

El diseño del directorio que mostró resultaría en que ninguna de las imágenes esté disponible.

De mis propios experimentos parece que tener una subcarpeta con cualquier elemento en ella, dentro de la carpeta res/drawable , hará que el compilador de recursos falla, evitando que el archivo R.java se genere correctamente.

La solución que estoy usando (y la que parece ser un Android) es esencialmente sustituir un guión bajo por una barra inclinada, por lo que su estructura se vería así:

 sandwich_tunaOnRye.png sandwich_hamAndSwiss.png drink_coldOne.png drink_hotTea.png 

El enfoque requiere que usted sea meticuloso en su nombramiento y no hace que sea mucho más fácil de la disputa de los archivos en sí (si usted decidió que las bebidas y los sándwiches deberían realmente todos ser " food ", tendría que hacer un cambio de nombre en masa en lugar de Simplemente moviéndolos al directorio); Pero la complejidad de su lógica de programación no sufre demasiado mal en comparación con la estructura de carpetas equivalente.

Esta situación es una mierda. Android es una mezcla de maravillosas y terribles decisiones de diseño. Sólo podemos esperar que la última porción para obtener eliminado con toda la prisa debido 🙂

Sí – no chupa 🙂 Sin embargo, puede utilizar la carpeta de activos y tener sub directorios en allí y cargar imágenes de esa manera.

Utilice la carpeta de activos.

Código de muestra:

 InputStream is = null; try { is = this.getResources().getAssets().open("test/sample.png"); } catch (IOException e) { ; } image = BitmapFactory.decodeStream(is); 

He escrito un complemento de eclipse que permite crear una subcarpeta virtual separando el nombre de archivo con dos subrayados __ . El proyecto está en las primeras etapas, pero no se preocupe, no bloqueará su IDE

Más detalles se pueden encontrar aquí, siéntase libre de bifurcación y enviar peticiones pull:

https://github.com/kirill578/Android-Sorted-Res-Folder

Introduzca aquí la descripción de la imagen

En realidad, en Android Studio es posible. Puede tener recursos anidados como se muestra aquí :

Introduzca aquí la descripción de la imagen

También hay un complemento para agrupar recursos aquí .

Me gusta usar un script simple para aplanar una estructura de directorio organizada proporcionada por los diseñadores a algo que se puede utilizar para generar un archivo R.

Ejecutar con la ruta actual en drawable-hdpi:

 #! /bin/bash DIRS=`find * -type d` for dir in ${DIRS} ; do for file in `ls ${dir}` ; do mv ${dir}/${file} ${dir}_${file}; done rmdir ${dir}; done 

En el estudio de android con gradle puede tener varios directores de fuente que le permitirá separar los recursos. Por ejemplo:

 android { .... android.sourceSets { main.res.srcDirs = ['src/main/extraresdirnamed_sandwiches', 'src/main/res'] } .... } 

Sin embargo, los nombres no deben colisionar, lo que significa que todavía tendrá que tener nombres como sandwiches_tunaOnRye, pero usted será capaz de tener una sección separada para todos sus sándwiches.

Esto le permite almacenar sus recursos en diferentes estructuras (útil para el contenido generado automáticamente, como actionbargenerator)

Una forma de resolver parcialmente el problema es usar el sufijo de nivel de API. Yo uso res / layout-v1, res / layout-v2 etc para mantener varios subproyectos en el mismo apk. Este mecanismo se puede utilizar para todos los tipos de recursos.

Obviamente, esto sólo puede utilizarse si está orientado a niveles de API por encima de res / layout-v? Tu estas usando.

Además, ten cuidado con el error en Android 1.5 y 1.6. Consulte la documentación de Andoroid sobre el sufijo de nivel de API .

Con el advenimiento del sistema de biblioteca, la creación de una biblioteca por gran conjunto de activos podría ser una solución.

Todavía es problemático, ya que uno debe evitar el uso de los mismos nombres dentro de todos los activos, pero el uso de un esquema de prefijo por biblioteca debe ayudar con eso.

No es tan simple como ser capaz de crear carpetas, pero que ayuda a mantener las cosas sanas …

Esto no es métodos perfectos. Tienes que implementar la misma manera que se muestra aquí .

También puede llamar a la imagen en la carpeta a través del código que puede utilizar

 Resources res = getResources(); Drawable shape = res. getDrawable(R.drawable.gradient_box); TextView tv = (TextView)findViewByID(R.id.textview); tv.setBackground(shape); 

No es mío, pero he encontrado este hilo al buscar este problema, si su uso de Android Studio y Gradle Construir el sistema de su muy fácil no hay plugins necesarios sólo un poco de edición de archivos de construcción

https://stackoverflow.com/a/22426467/618419

Gradle con Android Studio podría hacerlo de esta manera ( enlace ).

Está en el párrafo "Configuración de la Estructura"

 sourceSets { main { java { srcDir 'src/java' } resources { srcDir 'src/resources' } } } 

Existe una solución para esta situación: puede crear una resVector (por ejemplo) en el mismo nivel que la carpeta res predeterminada. Allí puede agregar cualquier carpeta de recursos drawable-xxx allí:

 resVector -drawable -layout -color 

Después de todo lo que necesitas es agregar

 sourceSets { main.res.srcDirs += 'src/main/resVector' } 

En su archivo build.gradle (dentro de android { } ).

 #!/usr/bin/env ruby # current dir should be drawable-hdpi/ etc # nuke all symlinks Dir.foreach('.') {|f| File.delete(f) if File.symlink?(f) } # symlink all resources renaming with underscores Dir.glob("**/*.png") {|f| system "ln -s #{f} #{f.gsub('/', '_')}" if f.include?("/") } 

Compruebe la secuencia Bash Flatten Folder que convierte la jerarquía de carpetas en una sola carpeta

Assets / Puede usarlo para almacenar archivos de activos sin procesar. Los archivos que guarda aquí se compilan en un archivo .apk tal cual, y se conserva el nombre de archivo original. Puede navegar por este directorio de la misma manera que un sistema de archivos típico usando URIs y leer archivos como un flujo de bytes usando AssetManager. Por ejemplo, esta es una buena ubicación para texturas y datos de juegos. http://developer.android.com/tools/projects/index.html

Los subdirectorios no están permitidos, el recurso debe contener sólo [a-z0-9_.].

No tienes mayúsculas y no barras.

Cree una carpeta en main. Como: 'res_notification_btn'

Y crear una carpeta de árbol en. Como 'drawable' o 'layout'

Entonces en 'build.gradle' añade esto

 sourceSets { main { res { srcDirs = ['src/main/res_notification_btn', 'src/main/res'] or srcDir 'src/main/res_notification_btn' } } } 
  • ¿Es R.layout.listview es lo mismo que R.id.listview
  • GetQuantityString devuelve cadena incorrecta con valor 0
  • No se puede usar el color referenciado (por tema) en dibujable
  • Espresso: Cómo utilizar R.string recursos de la carpeta androidTest
  • Xxhdpi densidad añadido en API 16, lo que en <16 si sólo proporcionar recursos xxhdpi?
  • La carpeta de anim no viene
  • Xamarin Archivo de recursos Android no encontrado
  • ¿Cómo obtengo el identificador de recurso de una imagen si conozco su nombre?
  • La razón de los activos y recursos crudos en Android
  • Transición cuando el cambio de tema (o Activity.recreate ())
  • Implementar y diseñar aplicaciones de Android para TV
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.