¿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.
- NavigationView onClick de xml provoca errores
- Archivos de recursos de cadenas múltiples con claves similares en Android
- No conseguir el pulgar con géneros - jugador de música universal
- Empaquetado de archivos de recursos de Android dentro de un archivo Jar distribuible
- Adición de un mapa de bits a los recursos desplegables
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.
- Método Android con prioridad (paquete) visibilidad sobreestablecimiento (no debería funcionar, pero sí, ¿por qué?)
- ¿Cómo se utiliza obtenerStyledAttributes (int ) con temas internos de Android
- ¿Cómo obtener un atributo en un recurso Drawable en Android?
- Maneras rápidas de importar trazos en Android Studio?
- Diseños específicos de densidad vs. diseños específicos de tamaño en Android
- Carpetas BitmapFactory.decodeResource y drawable *
- ¿Cómo puedo obtener el atributo fgcolor para trabajar en versiones recientes de Android?
- Android: cómo agregar a los niños de un diseño xml en una vista personalizada
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:
En realidad, en Android Studio es posible. Puede tener recursos anidados como se muestra aquí :
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
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' } } }
- ¿Cómo puedo añadir el nuevo "botón de acción flotante" entre dos widgets / diseños
- Recuperación de la versión de la API de Android mediante programación