Уроки - Может ли папка Android Layout содержать подпапки?

уроки - Может ли папка Android Layout содержать подпапки?

Я могу получить подпапки, следуя главному ответу на этот вопрос.

Однако по мере роста проекта у вас будет много подпапок:

Не большая проблема, но:

  • это некрасиво, так как список становится очень длинным.
  • вам нужно изменить app/build.gradle каждый раз, когда вы добавляете новую папку.

улучшение

Поэтому я написал простой метод Groovy для захвата всех вложенных папок:

Вставьте этот метод вне блока android в вашем app/build.gradle .

Как пользоваться

Для такой структуры:

Используйте его так:

Если у вас есть такая структура:

Вы будете использовать его следующим образом:

объяснение

getLayoutList() принимает a relative path в качестве аргумента. relative path относится к корню проекта. Поэтому, когда мы вводим "app/src/main/res/layouts/" , он возвращает все имена подпапок в виде массива, которые будут точно такими же:

Вот сценарий с комментариями для понимания:

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

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

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

Вы можете сделать это с помощью градиента. Я сделал демонстрационный проект, показывающий, как это сделать.

Хитрость заключается в использовании способности градиента объединить несколько папок ресурсов и установить папку res, а также вложенные подпапки в блоке sourceSets.

Причуда заключается в том, что вы не можете объявить папку ресурса контейнера, прежде чем объявлять папки дочерних ресурсов этой папки.

Ниже приведен блок sourceSets из файла build.gradle из демонстрации. Обратите внимание, что вложенные папки объявляются первыми.

Кроме того, прямой родитель ваших реальных файлов ресурсов (pngs, xml layouts и т. Д.) Все равно должен соответствовать specification .

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

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

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

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

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

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

Невозможно, но папка макета сортируется по имени. Итак, я добавляю имена файлов макетов с именами пакетов. Например, для двух пакетов «покупка» и «игра»:

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

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

Теперь мы можем легко сделать с плагином JetBrains под названием « Android File Grouping »,

проверить эту ссылку

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

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

Я думаю, что наиболее элегантным решением этой проблемы (учитывая, что вложенные папки не разрешены) является добавление имен файлов с именем папки, которую вы поместили бы внутри. Например, если у вас есть куча макетов для Activity, Fragment или просто общий вид, называемый «местами», вы должны просто добавить его с помощью place_my_layout_name. По крайней мере, это решает проблему их организации таким образом, что их легче найти в среде IDE. Это не самое удивительное решение, но это лучше, чем ничего.

Я просто хотел добавить фантастический ответ eskis для людей, у которых проблемы. (Примечание. Это будет работать и будет выглядеть как отдельные каталоги внутри «проекта», а не «андроид», к сожалению).

Протестировано следующим. BuildToolsVersion = 23.0.0 gradle 1.2.3 и 1.3.0

Вот как я получил свою работу с уже построенным проектом.

  1. Скопируйте все XML-файлы из своего каталога макета и поместите их в каталог на рабочем столе или что-то для резервного копирования.
  2. Удалите весь каталог макета (убедитесь, что вы скопировали все с шага 1 . )
  3. Щелкните правой кнопкой мыши каталог res и выберите новый> каталог.
  4. Назовите этот новый каталог «layouts». (Это может быть то, что вы хотите, но оно не будет каталогом «фрагмент» или «активностью», который появится позже).
  5. Щелкните правой кнопкой мыши новый каталог «layouts» и выберите новый каталог>. (Это будет имя типа файлов XML, которые вы будете иметь в нем, например, «фрагменты» и «действия»).
  6. Щелкните правой кнопкой мыши по каталогу «фрагмент» или «деятельность» (примечание: это необязательно «фрагмент» или «действия», это то, что я использую в качестве примера) и снова выберите новую> директорию и назовите этот каталог «макет». (Примечание: это ДОЛЖНО быть названо «макет» . Очень важно).
  7. Поместите XML-файлы в новый каталог «layout» из резервной копии, сделанной на вашем рабочем столе.
  8. Повторите шаги 5 - 7 для как можно большего количества настраиваемых каталогов.

Как только это будет завершено, зайдите в ваш файл gradly.build и создайте определение sourceSets, подобное этому . (Убедитесь, что 'src / main / res / layouts' & 'src / main / res' всегда являются нижними двумя! Как я показываю ниже).

Но серьезно .. вот как я заработал. Дайте мне знать, есть ли у кого-нибудь вопросы. Я могу попытаться помочь.

Картинки стоят больше, чем слов.

Я сделал это, чтобы создать отдельную папку res на том же уровне, что и фактическая папка res в вашем проекте, тогда вы можете использовать ее в своих приложениях build.gradle

то каждая вложенная папка вашей новой папки res может быть чем-то относящимся к каждому конкретному экрану или что-то в вашем приложении, и каждая папка будет иметь свой собственный layout / drawable / values т. д., сохраняя организованные вещи, и вам не нужно вручную обновлять файл gradle, как некоторые из этих других ответов требуется (просто синхронизируйте свой град каждый раз, когда вы добавляете новую папку ресурсов, чтобы он знал об этом, и не забудьте добавить соответствующие подпапки перед добавлением ваших xml-файлов).

📎📎📎📎📎📎📎📎📎📎