Может ли папка Android Layout содержать подпапки? - PullRequest
512 голосов
/ 08 февраля 2011

Прямо сейчас я храню каждый XML-файл макета в папке res/layout, поэтому можно легко и просто управлять небольшими проектами, но в случае крупных и тяжелых проектов должна быть иерархия. и подпапки, необходимые внутри папки макета.

например

layout
-- layout_personal
   -- personal_detail.xml
   -- personal_other.xml
--layout_address
  -- address1.xml
  -- address2.xml

Точно так же мы хотели бы иметь подпапки для большого приложения, так есть ли способ сделать это внутри проекта Android?

Я могу создавать вложенные папки layout-personal и layout_address внутри папки layout, но когда приходит время доступа к файлу макета xml с помощью R.layout ._______, в это время не появляется никаких всплывающих окон xml вверх в меню.

Ответы [ 18 ]

4 голосов
/ 14 мая 2014

Проверка Скрипт Bash Flatten Folder , который преобразует иерархию папок в одну папку

3 голосов
/ 18 августа 2016

Лучший ответ @eski хорош, но код не очень элегантен в использовании, поэтому я написал отличный скрипт в gradle для общего использования.Он применяется ко всем типам сборки и вкусу продукта, и его можно использовать не только для макета, но также можно добавить подпапку для любого другого типа ресурсов, например, для рисования.Вот код (поместите его в android блок файла Gradle уровня проекта):

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 для layout, добавьте строку с любым именем в переменную resDirs, например, layouts, тогда XML-файл макета должен быть помещен в res\layouts\activity\layout\xxx.xml.

Если я хочу создать подпапкус именем selectors для drawable, добавьте строку с любым именем в переменную resDirs, например, drawables, затем извлекаемый XML-файл должен быть помещен в res\drawables\selectors\drawable\xxx.xml.

Имя папки, напримерlayouts и drawables определены в переменной resDirs, это может быть любая строка.Все созданные вами подпапки, например activity или selectors, рассматриваются как папки res.Таким образом, в папке selectors мы должны дополнительно создать папку drawable и поместить файлы XML в папку drawable, после чего Gradle сможет распознавать файлы XML как обычно доступные для рисования.

3 голосов
/ 08 февраля 2011

Если вы разрабатываете на Linux или Mac Box, обходной путь будет создавать подпапки, которые содержат символические ссылки на ваши файлы макета.Просто используйте команду ln с -s

ln -s PATH_TO_YOUR_FILE

Проблема в том, что ваша папка Layout по-прежнему содержит все XML-файлы.Но вы можете выбрать их, используя подпапки.Это самое близкое к тому, что вы хотели бы получить.

Я только что прочитал, что это может работать и с Windows, если вы используете Vista или более позднюю версию.Это команда mklink.Просто Google, никогда не использовал его сам.

Еще одна проблема, если у вас есть файл, открытый и попробуйте открыть его снова, плагин генерирует исключение NULL Pointer Exception.Но это не зависает.

3 голосов
/ 02 июля 2015

Хотя все предложения для нескольких наборов ресурсов могут работать, проблема в том, что текущая логика для плагина Android Studio Gradle не будет обновлять файлы ресурсов после их изменения для вложенных наборов ресурсов. Текущая реализация пытается проверить каталоги ресурсов с помощью startWith (), поэтому вложенная структура каталогов (т.е. src / main / res / layout / layouts и src / main / res / layout / layouts_category2) выберет src / main / res / layout / layout постоянно и никогда не обновляет изменения. Конечным результатом является то, что вам приходится каждый раз перестраивать / очищать проект.

Я отправил патч на https://android -review.googlesource.com / # / c / 157971 / , чтобы попытаться помочь решить проблемы.

2 голосов
/ 22 июня 2018

Если вы используете метод в утвержденном ответе и хотите немного улучшить его, измените настройку gradle следующим образом:

    sourceSets {
    main {
        res.srcDirs = [
            file("src/main/res/layouts/").listFiles(),
            "src/main/res/layouts",
            "src/main/res"
        ]
    }
}

Так что, если вы добавите больше папок и макетов, вам не нужно возвращаться сюда и добавлять длинный список исходных папок, а Gradle предоставит вам все папки.

1 голос
/ 04 января 2018
  • Шаг 1: щелкните правой кнопкой мыши на макете - показать в проводнике
  • Шаг 2: Откройте папку макета и создайте подпапки напрямую: layout_1, layout_2 ...
  • Шаг 3: открыть layout_1 создать макет папки (примечание: обязательное имя макета), открыть папку layout_2 создать подкаталог макета (примечание: обязательное имя макета) ...
  • Шаг 4. Скопировать файлы xml в подкаталоги макета вlayout_1 и layout_2
  • Шаг 5: Запустите код в buid.grade (модульное приложение) и нажмите синхронизацию сейчас:

sourceSets {
    main {
        res.srcDirs =
            [
                'src / main / res / layout / layout_1'
                'src / main / res / layout / layout_2',
                'src / main / res'
            ]
    }
}
  • Шаг 6: Сводка: Все вышеперечисленные шаги помогут кластеризовать папки и отображать их в режиме «проект», тогда как режим «андроид» будет отображаться как обычно.
  • Поэтому я рисую, что, возможно, префиксы именования так же эффективны, как кластеризация папок.
0 голосов
/ 16 августа 2018

Лучшие ответы имеют несколько недостатков: вы должны добавить новые пути макета, 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/. Чтобы создать подпапки, вы должны использовать это меню: New> Folder> Res Folder.

UPDATE

Через пару недель я обнаружил, что изменения ресурсов не замечены Android Studio . Итак, появляются странные ошибки. Например, макеты продолжают показывать старые размеры, поля. Иногда AS не находит новые XML-файлы (особенно во время выполнения). Иногда он смешивает view id s (ссылки на другой XML-файл). Часто требуется нажать Build > Clean Project или Build > Rebuild Project. Прочитайте Требуется перестроение после изменения файлов макета XML в Android Studio .

0 голосов
/ 25 мая 2015

Ну, краткий ответ - нет.Но вы определенно можете иметь несколько папок res.Это, я думаю, как можно ближе к наличию подпапок для папки layout. Вот как как вы это делаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...