现在,我在'res/layout'文件夹内存储每个XML布局文件,因此管理小型项目是可行和简单的,但当有大型和繁重的项目的情况下,那么应该有一个层次结构和子文件夹内需要的布局文件夹。
如。
layout
-- layout_personal
-- personal_detail.xml
-- personal_other.xml
--layout_address
-- address1.xml
-- address2.xml
同样,我们希望大型应用程序有子文件夹,那么在Android项目中有办法做到这一点吗?
我能够在布局文件夹内创建layout-personal和layout_address子文件夹,但当需要使用R.layout访问XML布局文件时。_______,当时在菜单中没有任何XML布局弹出。
顶部答案有几个缺点:你必须添加新的布局路径,AS将新的资源放在res\layouts文件夹而不是res\values。
结合几个答案,我写下了类似的内容:
sourceSets {
main {
res.srcDirs =
[
'src/main/res',
file("src/main/res/layouts/").listFiles(),
'src/main/res/layouts'
]
}
}
我用这篇文章做了文件夹:http://alexzh.com/tutorials/how-to-store-layouts-in-different-folders-in-android-project/。为了创建子文件夹,你应该使用这个菜单:新建>文件夹> Res文件夹。
更新
几周后,我发现Android Studio并没有注意到资源的变化。于是,一些奇怪的虫子出现了。例如,布局仍然显示旧的尺寸和页边距。有时AS找不到新的xml文件(特别是在运行时)。有时它混合了视图id(对另一个xml文件的引用)。通常需要按Build > Clean Project或Build > Rebuild Project。在Android Studio中更改xml布局文件后,阅读需要重新构建的文件。
@eski给出的最上面的答案很好,但是代码使用起来并不优雅,所以我在gradle中编写了一个groovy脚本以供一般使用。它适用于所有构建类型和产品风格,不仅可以用于布局,还可以为任何其他资源类型(如drawable)添加子文件夹。下面是代码(把它放在项目级gradle文件的android块中):
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的子文件夹,在resDirs变量中添加任何名称的字符串,如布局,然后布局xml文件应该放在res\layouts\activity\layout\xxx.xml中。
如果我想为drawable创建名为selectors的子文件夹,在resDirs变量中添加任何名称的字符串,如drawables,那么drawable xml文件应该放在res\drawables\selectors\drawable xxx.xml中。
文件夹名称,如布局和drawables是在resDirs变量中定义的,它可以是任何字符串。
您创建的所有子文件夹,如活动或选择器,都被视为与res文件夹相同。所以在selectors文件夹中,我们必须另外创建一个drawable folder,把xml文件放到drawable folder中,这样gradle才能正常识别xml文件为drawable。