Vấn đề nhỏ
Tôi có thể đạt được các thư mục con bằng cách làm theo câu trả lời hàng đầu cho câu hỏi này.
Tuy nhiên, khi dự án phát triển lớn hơn, bạn sẽ có nhiều thư mục con:
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'
]
}
}
Không phải là một vấn đề lớn, nhưng:
- Nó không đẹp khi danh sách trở nên rất dài.
- bạn phải thay đổi
app/build.gradle
mỗi khi bạn thêm một thư mục mới.
Cải thiện
Vì vậy, tôi đã viết một phương thức Groovy đơn giản để lấy tất cả các thư mục lồng nhau:
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
}
Dán phương pháp này bên ngoài android {...}
khối trong của bạn app/build.gradle
.
Cách sử dụng
Đối với một cấu trúc như thế này:
<project root>
├── app <---------- TAKE NOTE
├── build
├── build.gradle
├── gradle
├── gradle.properties
├── gradlew
├── gradlew.bat
├── local.properties
└── settings.gradle
Sử dụng nó như thế này:
android {
sourceSets {
main {
res.srcDirs = getLayoutList("app/src/main/res/layouts/")
}
}
}
Nếu bạn có một cấu trúc như thế này:
<project root>
├── my_special_app_name <---------- TAKE NOTE
├── build
├── build.gradle
├── gradle
├── gradle.properties
├── gradlew
├── gradlew.bat
├── local.properties
└── settings.gradle
Bạn sẽ sử dụng nó như thế này:
android {
sourceSets {
main {
res.srcDirs = getLayoutList("my_special_app_name/src/main/res/layouts/")
}
}
}
Giải trình
getLayoutList()
lấy a relative path
làm đối số. Điều relative path
này có liên quan đến gốc của dự án. Vì vậy, khi chúng ta nhập vào "app/src/main/res/layouts/"
, nó sẽ trả về tất cả tên của các thư mục con dưới dạng một mảng, sẽ giống hệt như:
[
'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'
]
Đây là kịch bản có ý kiến để hiểu:
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
}
Hy vọng nó giúp!