ic_dialog_email - ¿Puede el directorio dibujable de Android contener subdirectorios?
layer list android (20)
En la documentación del SDK de Android, todos los ejemplos utilizados con la sintaxis de @ drawable / my_image xml tratan directamente las imágenes que están almacenadas en el directorio res / drawable en mi proyecto.
Me pregunto si no está bien explícitamente 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 hacer referencia 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.
- Haga clic derecho en Drawable
- Seleccione Nuevo ---> Directorio
- Ingrese el nombre del directorio. Por ejemplo: logo.png (la ubicación ya mostrará la carpeta dibujable de forma predeterminada)
- Copia y pega las imágenes directamente en la carpeta dibujable. Mientras pega, obtiene una opción para elegir mdpi / xhdpi / xxhdpi, etc. para cada una de las imágenes de una lista. Seleccione la opción apropiada e ingrese el nombre de la imagen. Asegúrese de mantener el mismo nombre que el nombre del directorio, es decir, logo.png
- Haz lo mismo con las imágenes restantes. Todos ellos se colocarán en la carpeta principal logo.png.
Activos / Puede usarlo para almacenar archivos de activos en bruto. Los archivos que guarda aquí se compilan en un archivo .apk tal como está, y el nombre de archivo original se conserva. Puede navegar por este directorio de la misma manera que un sistema de archivos típico que usa URI y leer archivos como una corriente de bytes con AssetManager. Por ejemplo, esta es una buena ubicación para texturas y datos de juegos. http://developer.android.com/tools/projects/index.html
Con la llegada del sistema de bibliotecas, crear una biblioteca por gran conjunto de activos podría ser una solución.
Sigue siendo problemático ya que uno debe evitar usar los mismos nombres en todos los activos, pero usar un esquema de prefijo por biblioteca debería ayudar con eso.
No es tan simple como ser capaz de crear carpetas, pero eso ayuda a mantener las cosas sanas ...
Crea una carpeta en main. como: ''res_notification_btn''
y crea una carpeta de árbol en. como ''dibujable'' o ''diseño''
luego en ''build.gradle'' agrega esto
sourceSets
{
main
{
res
{
srcDirs = [''src/main/res_notification_btn'', ''src/main/res'']
or
srcDir ''src/main/res_notification_btn''
}
}
}
En Android Studio con Gradle puede tener varios directores fuente que le permitirán separar los recursos. Por ejemplo:
android {
....
android.sourceSets {
main.res.srcDirs = [''src/main/extraresdirnamed_sandwiches'', ''src/main/res'']
}
....
}
Sin embargo, los nombres no deben coincidir, lo que significa que aún tendrá que tener nombres como sandwiches_tunaOnRye, pero podrá tener una sección separada para todos sus bocadillos.
Esto le permite almacenar sus recursos en diferentes estructuras (útil para contenido generado automáticamente, como actionbargenerator)
Escribí un plugin de eclipse que permite crear una subcarpeta virtual al separar el nombre del archivo con dos guiones bajos __
. El proyecto se encuentra en las primeras etapas, pero no se preocupe, no bloqueará su IDE.
Puede encontrar más detalles aquí, no dude en enviar y enviar solicitudes de extracción:
Esto no es métodos perfectos. Tienes que implementar la misma forma que se muestra here .
También puede llamar a la imagen debajo de la carpeta a través del código que puede usar
Resources res = getResources();
Drawable shape = res. getDrawable(R.drawable.gradient_box);
TextView tv = (TextView)findViewByID(R.id.textview);
tv.setBackground(shape);
Gradle con Android Studio podría hacerlo de esta manera ( link ).
Está en el párrafo "Configurando la estructura".
sourceSets {
main {
java {
srcDir ''src/java''
}
resources {
srcDir ''src/resources''
}
}
}
Hay una solución para esta situación: puede crear una resVector
(por ejemplo) en el mismo nivel que la carpeta de res
predeterminada. Allí puede agregar cualquier carpeta de recursos drawable-xxx
allí:
resVector
-drawable
-layout
-color
Después de eso todo lo que necesitas es agregar
sourceSets {
main.res.srcDirs += ''src/main/resVector''
}
en su archivo build.gradle
(dentro de android { }
).
La solución que estoy usando (y la que parece que favorece a Android) es esencialmente sustituir un guión bajo por una barra diagonal, para que su estructura se vea como esta:
sandwich_tunaOnRye.png
sandwich_hamAndSwiss.png
drink_coldOne.png
drink_hotTea.png
El enfoque requiere que sea meticuloso en su denominación y no hace que sea más fácil manipular los archivos (si decide que las bebidas y los sándwiches deberían ser realmente " food
", tendría que hacer un cambio de nombre masivo en lugar de simplemente moviéndolos al directorio); pero la complejidad de su lógica de programación no sufre demasiado en comparación con la estructura de carpetas equivalente.
Esta situación apesta de hecho. Android es una mezcla de maravillosas y terribles decisiones de diseño. Solo podemos esperar que la última parte se elimine con toda la prisa debida :)
Los subdirectorios no están permitidos, el recurso debe contener solo [a-z0-9_.].
No tienes letras mayúsculas y no hay barras diagonales.
Me gusta usar un script simple para aplanar una estructura de directorios organizada proporcionada por los diseñadores a algo que se puede usar 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
No es mío, pero encontré este hilo al buscar este problema, si su uso de Android Studio y el sistema Gradle Build es bastante fácil, no se necesitan complementos, solo un poco de edición del archivo de compilación
https://.com/a/22426467/618419
No, el mecanismo de recursos no admite subcarpetas en el directorio que se puede dibujar, así que sí, debe mantener esa jerarquía plana.
El diseño del directorio que mostró no generará ninguna de las imágenes disponibles.
Según mis propios experimentos, parece que tener una subcarpeta con cualquier elemento dentro de la carpeta res/drawable
causará fallas en el compilador de recursos, lo que R.java
archivo R.java
se genere correctamente.
Sí, apesta :) Sin embargo, puede usar la carpeta de activos y tener subdirectorios allí y cargar imágenes de esa manera.
Una forma de solucionar parcialmente el problema es usar el sufijo de nivel de API. Uso res / layout-v1, res / layout-v2, etc. para mantener múltiples subproyectos en la misma aplicación. Este mecanismo se puede utilizar para todos los tipos de recursos.
Obviamente, esto solo se puede usar si está apuntando 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 .
Utilizar 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);
Verifique el script de Bash Flatten Folder que convierte la jerarquía de carpetas en una sola carpeta
#!/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?("/")
}