Petit problème
Je suis en mesure d'obtenir des sous-dossiers en suivant la première réponse à cette question.
Cependant, à mesure que le projet s'agrandit, vous aurez de nombreux sous-dossiers:
sourceSets {
main {
res.srcDirs =
[
'src/main/res/layouts/somethingA',
'src/main/res/layouts/somethingB',
'src/main/res/layouts/somethingC',
'src/main/res/layouts/somethingD',
'src/main/res/layouts/somethingE',
'src/main/res/layouts/somethingF',
'src/main/res/layouts/somethingG',
'src/main/res/layouts/somethingH',
'src/main/res/layouts/...many more',
'src/main/res'
]
}
}
Pas un gros problème, mais:
- ce n'est pas joli car la liste devient très longue.
- vous devez changer votre
app/build.gradle
chaque fois que vous ajoutez un nouveau dossier.
Amélioration
J'ai donc écrit une méthode Groovy simple pour récupérer tous les dossiers imbriqués:
def getLayoutList(path) {
File file = new File(path)
def throwAway = file.path.split("/")[0]
def newPath = file.path.substring(throwAway.length() + 1)
def array = file.list().collect {
"${newPath}/${it}"
}
array.push("src/main/res");
return array
}
Collez cette méthode en dehors du android {...}
bloc dans votre app/build.gradle
.
Comment utiliser
Pour une structure comme celle-ci:
<project root>
├── app <---------- TAKE NOTE
├── build
├── build.gradle
├── gradle
├── gradle.properties
├── gradlew
├── gradlew.bat
├── local.properties
└── settings.gradle
Utilisez-le comme ceci:
android {
sourceSets {
main {
res.srcDirs = getLayoutList("app/src/main/res/layouts/")
}
}
}
Si vous avez une structure comme celle-ci:
<project root>
├── my_special_app_name <---------- TAKE NOTE
├── build
├── build.gradle
├── gradle
├── gradle.properties
├── gradlew
├── gradlew.bat
├── local.properties
└── settings.gradle
Vous l'utiliserez comme ceci:
android {
sourceSets {
main {
res.srcDirs = getLayoutList("my_special_app_name/src/main/res/layouts/")
}
}
}
Explication
getLayoutList()
prend a relative path
comme argument. Le relative path
est relatif à la racine du projet. Ainsi, lorsque nous "app/src/main/res/layouts/"
entrerons, il renverra le nom de tous les sous-dossiers sous forme de tableau, qui sera exactement le même que:
[
'src/main/res/layouts/somethingA',
'src/main/res/layouts/somethingB',
'src/main/res/layouts/somethingC',
'src/main/res/layouts/somethingD',
'src/main/res/layouts/somethingE',
'src/main/res/layouts/somethingF',
'src/main/res/layouts/somethingG',
'src/main/res/layouts/somethingH',
'src/main/res/layouts/...many more',
'src/main/res'
]
Voici le script avec des commentaires pour comprendre:
def getLayoutList(path) {
// let's say path = "app/src/main/res/layouts/
File file = new File(path)
def throwAway = file.path.split("/")[0]
// throwAway = 'app'
def newPath = file.path.substring(throwAway.length() + 1) // +1 is for '/'
// newPath = src/main/res/layouts/
def array = file.list().collect {
// println "filename: ${it}" // uncomment for debugging
"${newPath}/${it}"
}
array.push("src/main/res");
// println "result: ${array}" // uncomment for debugging
return array
}
J'espère que cela aide!