¿Puede el directorio de elementos de diseño de Android contener subdirectorios?


En la documentación del SDK de Android, todos los ejemplos utilizados con la sintaxis xml @drawable/my_image abordan 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 del elemento de diseño.

Por ejemplo, si tuviera la siguiente disposición del 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 para mantener la jerarquía plana en el directorio del elemento de diseño.

Author: user2864740, 2009-07-03

19 answers

No, el mecanismo de recursos no admite subcarpetas en el directorio del elemento de diseño, así que sí, necesita mantener esa jerarquía plana.

El diseño del directorio que mostraste resultaría en que ninguna de las imágenes estuviera disponible.

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

 484
Author: Reto Meier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-03 11:37:26

La solución que estoy usando (y la que el propio Android parece favorecer) es esencialmente sustituir un subrayado por una barra diagonal, por lo que su estructura se vería algo como esto:

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

El enfoque requiere que sea meticuloso en su nomenclatura y no hace que sea mucho más fácil manejar los archivos por sí mismos( si decidiera que las bebidas y los sándwiches realmente deberían ser " food", tendría que hacer un cambio de nombre masivo en lugar de simplemente moverlos al directorio); pero su la complejidad de la 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 decisiones de diseño maravillosas y terribles. Solo podemos esperar que la última porción sea eliminada con toda la prisa:)

 142
Author: Cheezmeister,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-03 17:57:18

Sí, apesta :) Sin embargo, puede usar la carpeta assets y tener subdirectorios allí y cargar imágenes de esa manera.

 31
Author: dijipiji,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-07 09:37:31

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

introduzca la descripción de la imagen aquí

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

 28
Author: android developer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-14 10:45:15

Utilice la carpeta assets.

Código de ejemplo:

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

image = BitmapFactory.decodeStream(is);
 22
Author: milkia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-12 12:38:48

He escrito un plugin eclipse que permite crear subcarpetas virtuales separando el nombre del archivo con dos guiones bajos __. El proyecto está en las primeras etapas, pero no te preocupes, no bloqueará tu IDE

Se pueden encontrar más detalles aquí, siéntase libre de bifurcar y enviar solicitudes de extracción:

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

introduzca la descripción de la imagen aquí

 20
Author: Kirill Kulakov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-03 15:29:07

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
 9
Author: Rene,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-30 10:54:53

En android studio con gradle puedes tener varios directores de código fuente que te permitirán separar recursos. Por ejemplo:

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

Sin embargo, los nombres no deben chocar, lo que significa que aún necesitará tener nombres como sandwiches_tunaOnRye, pero podrá tener una sección separada para todos sus sándwiches.

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

 9
Author: Alec Holmes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-03 08:54:22

Una forma de solucionar parcialmente el problema es usar el sufijo de nivel de API. Utilizo res / layout-v1, res/layout-v2, etc. para contener varios subproyectos en el mismo apk. 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 del res/layout-v? estás consumiendo.

También, cuidado con el error en Android 1.5 y 1.6. Consulte la documentación de Andoroid sobre el sufijo de nivel de API.

 4
Author: OferR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-27 09:31:54

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

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

No es tan simple como poder crear carpetas, pero eso ayuda a mantener las cosas sanas...

 2
Author: shi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-20 01:42:15

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

resVector
-drawable
-layout
-color

Después de eso todo lo que necesita es agregar

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

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

 2
Author: Anton Derevyanko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-07 12:08:15

Esto no es un método perfecto. Tienes que implementar la misma manera que se muestra aquí.

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);
 1
Author: user3177928,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-09 14:39:45

No es mío, pero encontré este hilo al buscar este problema, si usas Android Studio y Gradle Build system es bastante fácil, no es necesario usar complementos, solo un poco de edición de archivos de compilación

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

 1
Author: Captnwalker1,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:38

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'
    }
 }
}
 1
Author: user3290180,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-30 07:46:51

Cree una carpeta en main. me gusta: 'res_notification_btn'

Y crear la carpeta de árbol en. como 'imagen' o 'diseño'

Luego en 'build.gradle ' añadir esto

sourceSets
            {
                main
                {
                    res
                    {
                        srcDirs = ['src/main/res_notification_btn', 'src/main/res']
                      or
                        srcDir 'src/main/res_notification_btn'
                    }
                }
            }
 1
Author: Ali Bagheri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-29 06:43:12
#!/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?("/")
}
 0
Author: Blake Miller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-29 17:59:02

Comprobar Bash Aplanar carpeta script que convierte la jerarquía de carpetas a una sola carpeta

 0
Author: Sneg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-14 08:32:23

Activos/ Puede usarlo para almacenar archivos de activos sin procesar. Los archivos que guardas aquí se compilan en un .archivo apk tal cual, y el nombre del archivo original se conserva. Puede navegar por este directorio de la misma manera que un sistema de archivos típico usando URI y leer archivos como una secuencia 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

 0
Author: Alex M,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-01 17:24:47

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

No tiene letras mayúsculas, y no tiene barras inclinadas.

 0
Author: Ferhat Aslan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-13 14:38:46