Лучший ответ @eski хорош, но код не очень элегантен в использовании, поэтому я написал отличный скрипт в gradle для общего использования.Он применяется ко всем типам сборки и вкусу продукта, и его можно использовать не только для макета, но также можно добавить подпапку для любого другого типа ресурсов, например, для рисования.Вот код (поместите его в android
блок файла Gradle уровня проекта):
sourceSets.each {
def rootResDir = it.res.srcDirs[0]
def getSubDirs = { dirName ->
def layoutsDir = new File(rootResDir, dirName)
def subLayoutDirs = []
if (layoutsDir.exists()) {
layoutsDir.eachDir {
subLayoutDirs.add it
}
}
return subLayoutDirs
}
def resDirs = [
"anims",
"colors",
"drawables",
"drawables-hdpi",
"drawables-mdpi",
"drawables-xhdpi",
"drawables-xxhdpi",
"layouts",
"valuess",
]
def srcDirs = resDirs.collect {
getSubDirs(it)
}
it.res.srcDirs = [srcDirs, rootResDir]
}
Как это сделать на практике?
Например, я хочу создать подпапку с именемactivity
для layout
, добавьте строку с любым именем в переменную resDirs
, например, layouts
, тогда XML-файл макета должен быть помещен в res\layouts\activity\layout\xxx.xml
.
Если я хочу создать подпапкус именем selectors
для drawable
, добавьте строку с любым именем в переменную resDirs
, например, drawables
, затем извлекаемый XML-файл должен быть помещен в res\drawables\selectors\drawable\xxx.xml
.
Имя папки, напримерlayouts
и drawables
определены в переменной resDirs
, это может быть любая строка.Все созданные вами подпапки, например activity
или selectors
, рассматриваются как папки res
.Таким образом, в папке selectors
мы должны дополнительно создать папку drawable
и поместить файлы XML в папку drawable
, после чего Gradle сможет распознавать файлы XML как обычно доступные для рисования.