Прямо сейчас я храню каждый 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 внутри меню.
android
android-layout
Пареш Майани
источник
источник
Ответы:
Вы можете сделать это с Gradle. Я сделал демонстрационный проект, показывающий как.
Хитрость заключается в том, чтобы использовать возможность Gradle для объединения нескольких папок ресурсов и установить папку res, а также вложенные подпапки в блоке sourceSets.
Суть в том, что вы не можете объявить папку ресурса контейнера до того, как объявите папки дочерних ресурсов этой папки.
Ниже приведен блок sourceSets из файла build.gradle из демоверсии. Обратите внимание, что подпапки объявляются первыми.
Кроме того, непосредственный родительский элемент ваших фактических файлов ресурсов (pngs, xml-макеты и т. Д.) Все еще должен соответствовать спецификации .
источник
R.layout.list_item
он исходит из папкиmovies
илиcinemas
, поэтому по-прежнему применяется плоское именование.build:gradle:0.14.4
иbuildToolsVersion "21.1.1"
.URI is not registered
проблемы.Ответ - нет.
Я хотел бы обратить ваше внимание на эту книгу Pro Android 2, в которой говорится:
источник
raw
качестве ресурсов, вы получаете чередование, зависящее от плотности / ориентации / версии / и т. Д., В то время как с этимassets
вы должны делать это вручную.Я просто хотел добавить к фантастическому ответу eskis для людей, имеющих проблемы. (Примечание: это будет работать и выглядеть как отдельные каталоги внутри представления проекта, к сожалению, не представления андроида.)
Проверено со следующим. BuildToolsVersion = 23.0.0 gradle 1.2.3 и 1.3.0
Вот так я и начал работать с уже построенным проектом.
После этого перейдите в файл gradle.build своих модулей и создайте определение sourceSets следующим образом ... (Убедитесь, что 'src / main / res / layouts' & 'src / main / res' всегда два нижних !! Как я показываю ниже).
Прибыль $$$$
А если серьезно .. вот как я получил это на работу. Дайте мне знать, если у кого-то возникнут вопросы ... Я могу попытаться помочь.
Картинки стоят дороже слов.
источник
layout-v21
?'src/main/res/layouts/content'
и путь к этой конфигурации'src/main/res/layouts/content/layout'
Не возможно, но папка макета отсортирована по имени. Итак, я добавляю имена файлов макета с именами моих пакетов. Например, для двух пакетов «покупка» и «игра»:
источник
Я использую Android File Группирование плагин для Android Studio.It на самом деле не позволяет создавать вложенные папки, но он может отображать файлы и ресурсы , поскольку они находятся в разных папках. И это именно то, что я хотел.
Вы можете установить плагин "Android File Grouping"
Окна:
Mac:
Для Mac я смог протестировать его и не смог найти плагин. Поэтому я скачал плагин отсюда и использовал
Install plugin from disk
опцию из вышеупомянутой настройки.источник
Теперь с Android Studio и Gradle вы можете иметь несколько папок ресурсов в вашем проекте. Позволяет организовать не только ваши файлы макетов, но и любые виды ресурсов.
Это не совсем подпапка, но может разделять части вашего приложения.
Конфигурация такая:
Проверьте документацию .
источник
clean
чтобы это отразилось на приложении.Я думаю, что наиболее элегантное решение этой проблемы (учитывая, что подпапки не допускаются) состоит в добавлении имени файла к имени папки, в которую вы бы поместили его. Например, если у вас есть несколько макетов для вида деятельности, фрагмента или просто общего вида, называемых «местами», то вам просто нужно добавить к нему местами местный_имя_слова_имя. По крайней мере, это решает проблему их организации таким образом, чтобы их было легче найти в среде IDE. Это не самое крутое решение, но лучше, чем ничего.
источник
Маленькая проблема
Я могу получить подпапки, следуя топ-ответ на этот вопрос.
Однако по мере роста проекта у вас будет много подпапок:
Не большая проблема, но:
app/build.gradle
каждый раз, когда вы добавляете новую папку.улучшение
Поэтому я написал простой метод Groovy для захвата всех вложенных папок:
Вставьте этот метод за пределы
android {...}
блока в вашемapp/build.gradle
.Как пользоваться
Для такой структуры:
Используйте это так:
Если у вас есть такая структура:
Вы будете использовать это так:
объяснение
getLayoutList()
принимаетa relative path
в качестве аргумента.relative path
Является относительно корня проекта. Поэтому, когда мы введем"app/src/main/res/layouts/"
, он вернет имя всех подпапок в виде массива, который будет точно таким же, как:Вот скрипт с комментариями для понимания:
Надеюсь, поможет!
источник
setContentView(R.layout.Admin.admin_home .)
Admin.admin_home не разрешеноR.layout.admin_home
. Сценарий должен автоматически подбирать имена для вас. Дайте мне знать, если вы можете заставить его работать.array.push("src/main/res");
на,def res="src/main/res";
array.push(res);
потому что у меня есть ошибка, так как push хочет, чтобы параметр Gstring не String one. Если любой, а не я обнаружил эту ошибку, вы можете ее отредактировать// uncomment for debugging
а затем проверить, правильно ли определены выходыsrc/main/res/layouts/<your_layout_files>
?Теперь мы можем легко сделать с плагином JetBrains под названием « Android File Grouping »
проверить эту ссылку
Группировка файлов Android
источник
Android Studio
Я сделал это, создав отдельную папку res на том же уровне, что и текущая папка res в вашем проекте, а затем вы можете использовать это в своих приложениях build.gradle
тогда каждая подпапка вашей новой папки res может быть связана с каждым конкретным экраном или чем-то в вашем приложении, и каждая папка будет иметь свой собственный
layout
/drawable
/values
etc, упорядочивающий вещи, и вам не придется обновлять файл gradle вручную, как некоторые из этих других требуются ответы (просто синхронизируйте ваш gradle каждый раз, когда вы добавляете новую папку ресурсов, чтобы она знала об этом, и обязательно добавляйте соответствующие подпапки перед добавлением ваших XML-файлов).источник
Проверьте скрипт Bash Flatten Folder, который преобразует иерархию папок в одну папку
источник
Если вы разрабатываете на Linux или Mac Box, обходной путь, чтобы создать подпапки, которые содержат символические ссылки на ваши файлы макета. Просто используйте команду ln с -s
Проблема в том, что ваша папка Layout по-прежнему содержит все XML-файлы. Но вы можете выбрать их, используя подпапки. Это самое близкое к тому, что вы хотели бы иметь.
Я только что прочитал, что это может работать и с Windows, если вы используете Vista или более позднюю версию. Есть эта
mklink
команда. Просто погуглите, никогда не использовал это сам.Другая проблема заключается в том, что если файл открыт и вы пытаетесь открыть его снова, плагин генерирует исключение NULL Pointer Exception. Но это не вешает трубку.
источник
Хотя все предложения для нескольких наборов ресурсов могут работать, проблема в том, что текущая логика для плагина 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/, чтобы попытаться помочь решить проблемы.
источник
Верхний ответ @eski хорош, но код не изящен в использовании, поэтому я написал отличный скрипт в gradle для общего пользования. Он применяется ко всем типам сборки и вкусу продукта, и его можно использовать не только для макета, но также можно добавить подпапку для любого другого типа ресурсов, например, для рисования. Вот код (поместите его в
android
блок файла Gradle уровня проекта):Как это сделать на практике?
Например, я хочу создать подпапку с именем
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
дополнительно создать папку и поместить вdrawable
нее файлы XML , после чего Gradle сможет распознавать файлы XML как обычно доступные для рисования.источник
Если вы используете метод в утвержденном ответе и хотите немного улучшить его, измените настройку gradle следующим образом:
Так что, если вы добавите больше папок и макетов, вам не нужно возвращаться сюда и добавлять длинный список исходных папок, пусть Gradle получит все папки для вас.
источник
источник
Project
режим. Я не мог понять, куда исчезли подпапки (вAndroid
режиме).Ну, короткий ответ - нет. Но вы определенно можете иметь несколько
res
папок. Это, я думаю, как можно ближе к наличию подпапок дляlayout
папки. Вот как ты это делаешь.источник
Лучшие ответы имеют несколько недостатков: вы должны добавить новые пути макета, AS помещает новые ресурсы в
res\layouts
папку вместоres\values
.Объединив несколько ответов, я написал подобное:
Я сделал папки с этой статьей: http://alexzh.com/tutorials/how-to-store-layouts-in-different-folders-in-android-project/ . Для создания подпапок вы должны использовать это меню: New> Folder> Res Folder.
ОБНОВИТЬ
Через пару недель я обнаружил, что изменения в ресурсах не замечены Android Studio . Итак, появляются странные ошибки. Например, макеты продолжают показывать старые размеры, поля. Иногда AS не находит новые XML-файлы (особенно во время выполнения). Иногда он смешивает
view id
s (ссылки на другой XML-файл). Часто требуется нажатьBuild > Clean Project
илиBuild > Rebuild Project
. Чтение Требуется восстановление после изменения файлов макета XML в Android Studio .источник
res
папке, потому что AS не поддерживает разделение ресурсов на папки. Возможно, я изменю этот ответ или даже удалю. Но что вы имеете в виду, когда говорите, что это неприемлемый способ предоставления решений здесь на SO?Не может быть подкаталогов (легко), но вы можете иметь дополнительные папки ресурсов. Удивило, что никто уже не упомянул об этом, но сохранил папки ресурсов по умолчанию и добавил еще несколько:
источник