ปัญหาเล็ก ๆ
ฉันสามารถบรรลุโฟลเดอร์ย่อยได้โดยทำตามคำตอบสูงสุดของคำถามนี้
อย่างไรก็ตามเมื่อโครงการขยายใหญ่ขึ้นคุณจะมีโฟลเดอร์ย่อยมากมาย:
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'
]
}
}
ไม่ใช่ปัญหาใหญ่ แต่:
- มันไม่สวยเลยเมื่อรายการยาวมาก
- คุณต้องเปลี่ยน
app/build.gradle
ทุกครั้งที่คุณเพิ่มโฟลเดอร์ใหม่
การปรับปรุง
ดังนั้นฉันจึงเขียนวิธี Groovy ง่ายๆเพื่อคว้าโฟลเดอร์ที่ซ้อนกันทั้งหมด:
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
}
วางวิธีนี้ด้านนอกของบล็อกของคุณandroid {...}
app/build.gradle
วิธีใช้
สำหรับโครงสร้างเช่นนี้:
<project root>
├── app <---------- TAKE NOTE
├── build
├── build.gradle
├── gradle
├── gradle.properties
├── gradlew
├── gradlew.bat
├── local.properties
└── settings.gradle
ใช้มันแบบนี้:
android {
sourceSets {
main {
res.srcDirs = getLayoutList("app/src/main/res/layouts/")
}
}
}
หากคุณมีโครงสร้างเช่นนี้:
<project root>
├── my_special_app_name <---------- TAKE NOTE
├── build
├── build.gradle
├── gradle
├── gradle.properties
├── gradlew
├── gradlew.bat
├── local.properties
└── settings.gradle
คุณจะใช้มันในลักษณะนี้:
android {
sourceSets {
main {
res.srcDirs = getLayoutList("my_special_app_name/src/main/res/layouts/")
}
}
}
คำอธิบาย
getLayoutList()
ใช้a relative path
เป็นอาร์กิวเมนต์ The relative path
สัมพันธ์กับรูทของโครงการ ดังนั้นเมื่อเราใส่"app/src/main/res/layouts/"
มันจะส่งกลับชื่อโฟลเดอร์ย่อยทั้งหมดเป็นอาร์เรย์ซึ่งจะเหมือนกับ:
[
'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'
]
นี่คือสคริปต์ที่มีความคิดเห็นเพื่อความเข้าใจ:
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
}
หวังว่ามันจะช่วย!