现在,我在'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布局文件后,阅读需要重新构建的文件。

其他回答

简而言之,答案是否定的。但你肯定可以有多个分辨率文件夹。我认为这是最接近布局文件夹的子文件夹了。你可以这样做。

While all the proposals for multiple resource sets may work, the problem is that the current logic for the Android Studio Gradle plug-in will not update the resource files after they have changed for nested resource sets. The current implementation attempts to check the resource directories using startsWith(), so a directory structure that is nested (i.e. src/main/res/layout/layouts and src/main/res/layout/layouts_category2) will choose src/main/res/layout/layouts consistently and never actually update the changes. The end result is that you have to rebuild/clean the project each time.

我在https://android-review.googlesource.com/#/c/157971/上提交了一个补丁,试图帮助解决问题。

现在有了Android Studio和Gradle,你可以在你的项目中有多个资源文件夹。允许组织不仅你的布局文件,但任何类型的资源。

它不是一个确切的子文件夹,但可以分离应用程序的部分。

配置如下:

sourceSets {
    main {
        res.srcDirs = ['src/main/res', 'src/main/res2']
    }
}

检查文档。

你可以用gradle做到这一点。我做了一个演示项目来展示如何做到这一点。

诀窍是使用gradle的能力来合并多个资源文件夹,并设置res文件夹以及sourceSets块中的嵌套子文件夹。

奇怪的是,在声明容器资源文件夹的子资源文件夹之前,您不能声明该文件夹。

下面是构建中的sourceSets块。演示中的Gradle文件。注意,先声明子文件夹。

sourceSets {
    main {
        res.srcDirs = [
            'src/main/res/layouts/layouts_category2',
            'src/main/res/layouts',
            'src/main/res'
        ]
    }
}

另外,实际资源文件(png、xml布局等)的直接父文件仍然需要与规范相对应。

如果你是在linux或mac上开发,一种变通方法是,创建包含符号链接到布局文件的子文件夹。只需使用ln命令和-s

ln -s PATH_TO_YOUR_FILE

问题是,你的布局文件夹仍然包含所有的.xml文件。但是你可以通过使用子文件夹来选择它们。这是最接近你想要的东西。

我刚读到,如果你使用的是Vista或更高版本,这可能也适用于Windows。这里有一个mklink命令。只是谷歌,我从来没用过。

另一个问题是,如果你已经打开了文件,并试图再次打开它,插件抛出一个空指针异常。但它并没有挂断。