En este momento, estoy almacenando cada archivo de diseño xml dentro de la res/layout
carpeta, por lo que es factible y simple administrar proyectos pequeños, pero cuando hay un caso de proyectos grandes y pesados, entonces debería haber una jerarquía y subcarpetas necesarias dentro La carpeta de diseño.
por ej.
layout
-- layout_personal
-- personal_detail.xml
-- personal_other.xml
--layout_address
-- address1.xml
-- address2.xml
De la misma manera, nos gustaría tener subcarpetas para la aplicación grande, entonces, ¿hay alguna forma de hacerlo dentro del proyecto de Android?
Puedo crear subcarpetas layout-personal y layout_address dentro de la carpeta de diseño, pero cuando llega el momento de acceder al archivo de diseño xml usando R.layout ._______, en ese momento no hay ninguna ventana emergente de diseño xml dentro del menú.
android
android-layout
Paresh Mayani
fuente
fuente
Respuestas:
PUEDES hacer esto con gradle. Hice un proyecto de demostración que muestra cómo.
El truco consiste en utilizar la capacidad de gradle para fusionar múltiples carpetas de recursos y establecer la carpeta res, así como las subcarpetas anidadas en el bloque sourceSets.
La peculiaridad es que no puede declarar una carpeta de recursos del contenedor antes de declarar las carpetas de recursos secundarios de esa carpeta.
A continuación se muestra el bloque sourceSets del archivo build.gradle de la demostración. Observe que las subcarpetas se declaran primero.
Además, el padre directo de sus archivos de recursos reales (pngs, diseños xml, etc.) aún debe corresponder con la especificación .
fuente
R.layout.list_item
proviene demovies
lacinemas
carpeta o de la carpeta, por lo que aún se aplica el nombre plano.build:gradle:0.14.4
ybuildToolsVersion "21.1.1"
.URI is not registered
problema.La respuesta es no.
Me gustaría llamar su atención hacia este libro Pro Android 2 que dice:
fuente
raw
como recursos, se obtienen bandas dependientes de densidad / orientación / versión / etc., mientras que conassets
eso debe hacerlo manualmente.Solo quería agregar a la fantástica respuesta de eskis para las personas que tienen problemas. (Nota: Desafortunadamente, esto solo funcionará y se verá como directorios separados dentro de la vista 'proyecto', no la vista 'android').
Probado con lo siguiente. BuildToolsVersion = 23.0.0 gradle 1.2.3 y 1.3.0
Así es como conseguí que el mío trabajara con un proyecto ya construido.
Una vez que esto se haya completado, ingrese al archivo gradle.build de sus módulos y cree una definición de SourceSets como esta ... (¡Asegúrese de que 'src / main / res / layouts' y 'src / main / res' sean siempre los dos últimos !! !! Como estoy mostrando a continuación).
Beneficio $$$$
Pero en serio ... así es como lo puse a trabajar. Avíseme si alguien tiene alguna pregunta. Puedo intentar ayudar.
Las imágenes valen más que las palabras.
fuente
layout-v21
?'src/main/res/layouts/content'
y la ruta de esta configuración es'src/main/res/layouts/content/layout'
No es posible, pero la carpeta de diseño está ordenada por nombre. Por lo tanto, antepongo los nombres de archivo de diseño con los nombres de mis paquetes. Por ejemplo, para los dos paquetes "comprar" y "jugar":
fuente
Utilizo el complemento de agrupación de archivos de Android para Android Studio. Realmente no le permite crear subcarpetas, pero puede VISUALIZAR sus archivos y recursos, ya que están en diferentes carpetas. Y esto es exactamente lo que quería.
Puede instalar el complemento "Agrupación de archivos de Android"
Ventanas:
Mac:
Para Mac, pude probarlo y no pude buscar el complemento. Así que descargué el complemento desde aquí y utilicé la
Install plugin from disk
opción de la configuración anterior.fuente
Ahora con Android Studio y Gradle, puede tener múltiples carpetas de recursos en su proyecto. Permitiendo organizar no solo sus archivos de diseño sino también cualquier tipo de recursos.
No es exactamente una subcarpeta, pero puede separar partes de su aplicación.
La configuración es así:
Revisa la documentación .
fuente
clean
para verlo reflejado en la aplicación.Creo que la solución más elegante para este problema (dado que las subcarpetas no están permitidas) es anteponer los nombres de archivo con el nombre de la carpeta en la que lo habría colocado. Por ejemplo, si tiene un montón de diseños para una Actividad, un Fragmento o simplemente una vista general llamada "lugares", entonces debe anteponerlo con places_my_layout_name. Al menos esto resuelve el problema de organizarlos de manera que sean más fáciles de encontrar dentro del IDE. No es la solución más increíble, pero es mejor que nada.
fuente
Pequeño problema
Puedo lograr subcarpetas siguiendo la respuesta principal a esta pregunta.
Sin embargo, a medida que el proyecto crezca, tendrá muchas subcarpetas:
No es un gran problema, pero:
app/build.gradle
cada vez que agregas una nueva carpeta.Mejora
Así que escribí un método Groovy simple para tomar todas las carpetas anidadas:
Pegue este método fuera del
android {...}
bloque en suapp/build.gradle
.Cómo utilizar
Para una estructura como esta:
Úselo así:
Si tienes una estructura como esta:
Lo usarás así:
Explicación
getLayoutList()
tomaa relative path
como argumento. Elrelative path
es relativo a la raíz del proyecto. Entonces, cuando ingresamos"app/src/main/res/layouts/"
, devolverá el nombre de todas las subcarpetas como una matriz, que será exactamente igual a:Aquí está el guión con comentarios para comprender:
¡Espero eso ayude!
fuente
setContentView(R.layout.Admin.admin_home .)
Admin.admin_home no se resuelveR.layout.admin_home
. El script debería poder recoger automáticamente los nombres por usted. Avísame si puedes hacer que funcione.array.push("src/main/res");
adef res="src/main/res";
array.push(res);
porque tengo un error como parámetro de empuje quiere Gstring no de la secuencia una .Si cualquiera en lugar de me encontró este error se puede editar// uncomment for debugging
y luego verificar si las salidassrc/main/res/layouts/<your_layout_files>
se detectan correctamente?Ahora podemos hacerlo fácilmente con el complemento JetBrains llamado " Agrupación de archivos de Android "
mira este enlace
Agrupación de archivos de Android
fuente
Android Studio
Una forma en que lo hice fue crear una carpeta de resolución separada en el mismo nivel que la carpeta de resolución real en su proyecto, luego puede usar esto en sus aplicaciones build.gradle
entonces cada subcarpeta de su nueva carpeta de resolución puede ser algo relacionado con cada pantalla en particular o algo en su aplicación, y cada carpeta tendrá su propio
layout
/drawable
/values
etc para mantener las cosas organizadas y no tendrá que actualizar el archivo gradle manualmente como algunos de estos otros las respuestas requieren (Simplemente sincronice su gradle cada vez que agregue una nueva carpeta de recursos para que lo sepa, y asegúrese de agregar las subcarpetas relevantes antes de agregar sus archivos xml).fuente
Verifique el script Bash Flatten Folder que convierte la jerarquía de carpetas en una sola carpeta
fuente
Si está desarrollando en un cuadro de Linux o Mac, una solución sería crear subcarpetas que incluyan enlaces simbólicos a sus archivos de diseño. Simplemente use el comando ln con -s
El problema con esto es que su carpeta de diseño todavía contiene todos los archivos .xml. Pero podría seleccionarlos utilizando las subcarpetas. Es lo más parecido a lo que te gustaría tener.
Acabo de leer que esto también podría funcionar con Windows si está utilizando Vista o posterior. Hay esto
mklink
comando. Solo googlealo, nunca lo he usado yo mismoOtro problema es que si tiene el archivo abierto e intenta abrirlo nuevamente, el complemento genera una excepción de puntero nulo. Pero no cuelga.
fuente
Si bien todas las propuestas para conjuntos de recursos múltiples pueden funcionar, el problema es que la lógica actual del complemento Android Studio Gradle no actualizará los archivos de recursos después de que hayan cambiado los conjuntos de recursos anidados. La implementación actual intenta verificar los directorios de recursos utilizando beginWith (), por lo que una estructura de directorio que está anidada (es decir, src / main / res / layout / layouts y src / main / res / layout / layouts_category2) elegirá src / main / res / layout / layouts consistentemente y nunca actualizan los cambios. El resultado final es que debe reconstruir / limpiar el proyecto cada vez.
Envié un parche en https://android-review.googlesource.com/#/c/157971/ para intentar ayudar a resolver las cosas.
fuente
La respuesta principal de @eski es buena, pero el código no es elegante de usar, así que escribí un script maravilloso en gradle para uso general. Se aplica a todo tipo de compilación y sabor de producto y no solo se puede usar para el diseño, sino que también puede agregar subcarpetas para cualquier otro tipo de recursos, como por ejemplo, dibujable. Aquí está el código (póngalo en el
android
bloque del archivo gradle de nivel de proyecto):¿Cómo hacer en la práctica?
Por ejemplo, quiero crear subcarpeta llamada
activity
paralayout
, agregar una cadena con cualquier nombre deresDirs
variable, tal comolayouts
, a continuación, el archivo xml diseño debe ser puesto enres\layouts\activity\layout\xxx.xml
.Si quiero crear subcarpeta llamada
selectors
paradrawable
, agregar una cadena con cualquier nombre deresDirs
variable, tal comodrawables
, a continuación, el archivo XML estirable debe ser puesto enres\drawables\selectors\drawable\xxx.xml
.El nombre de la carpeta como
layouts
ydrawables
se define enresDirs
variable, puede ser cualquier cadena. Todas las subcarpetas creadas por usted, comoactivity
oselectors
se consideran iguales a lares
carpeta. Entonces, en laselectors
carpeta, debemos crear unadrawable
carpeta adicional y poner los archivos xml en ladrawable
carpeta, después de eso gradle puede reconocer los archivos xml como dibujables normalmente.fuente
Si usa el método en la respuesta aprobada y desea mejorarlo un poco, cambie la configuración de gradle de esta manera:
Entonces, si agrega más carpetas y diseños, no necesita volver aquí y agregar una larga lista de carpetas de origen, deje que Gradle obtenga todas las carpetas por usted.
fuente
fuente
Project
modo. No pude entender dónde desaparecieron las subcarpetas (enAndroid
modo).Bueno, la respuesta corta es no. Pero definitivamente puedes tener múltiples
res
carpetas. Eso, creo, es lo más cercano a tener subcarpetas para lalayout
carpeta. Así es como lo haces.fuente
Las principales respuestas tienen varias desventajas: debe agregar nuevas rutas de diseño, AS coloca nuevos recursos en la
res\layouts
carpeta en lugar deres\values
.Combinando varias respuestas escribí similar:
Hice carpetas con este artículo: http://alexzh.com/tutorials/how-to-store-layouts-in-different-folders-in-android-project/ . Para crear subcarpetas, debe usar este menú: Nuevo> Carpeta> Carpeta Res.
ACTUALIZAR
Después de un par de semanas descubrí que Android Studio no nota cambios en los recursos . Entonces, aparecen algunos errores extraños. Por ejemplo, los diseños continúan mostrando tamaños antiguos, márgenes. A veces, AS no encuentra nuevos archivos XML (especialmente durante el tiempo de ejecución). A veces se mezclan
view id
s (referencias a otro archivo XML). A menudo se requiere presionarBuild > Clean Project
oBuild > Rebuild Project
. Leer Reconstrucción requerida después de cambiar los archivos de diseño xml en Android Studio .fuente
res
carpeta tradicional , porque AS no es totalmente compatible con la división de recursos en carpetas. Probablemente cambiaré esta respuesta o incluso la eliminaré. Pero, ¿qué quiere decir cuando dice que no es una forma aceptable de proporcionar soluciones aquí en SO?No puede tener subdirectorios (fácilmente) pero puede tener carpetas de recursos adicionales . Sorprendido, ya nadie lo mencionó, pero para mantener las carpetas de recursos predeterminadas y agregar algo más:
fuente