Чи може папка Android Layout містити підпапки?


551

Зараз я зберігаю кожен файл формату XML всередині res/layoutпапки, тому керувати малими проектами можливо і просто, але коли є випадок великих і важких проектів, тоді всередині має бути необхідна ієрархія та підпапки. папка макета.

напр

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

Так само, як і ми хотіли б мати підпапки для великого додатка, тож чи є це в рамках проекту Android?

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



Я думаю, що це посилання може вам детально допомогти. blog.mindorks.com/…
Діліп Поудель

Відповіді:


475

МОЖЕТЕ це зробити з градулами. Я зробив демонстраційний проект, який показує, як.

Трюк полягає у використанні можливості gradle для об'єднання декількох папок ресурсів та встановлення папки res, а також вкладених папок у блоці sourceSets.

Примітка полягає в тому, що ви не можете оголосити папку ресурсів контейнера, перш ніж оголосити дочірні папки ресурсів цієї папки.

Нижче показаний блок sourceSets з файлу build.gradle з демонстраційної версії. Зауважте, що підпапки оголошуються першими.

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

картинка вкладених ресурсів

Крім того, прямому батькові фактичних файлів ресурсів (pngs, макетів xml тощо) все ще потрібно відповідати специфікації .


6
Чи можливо це зробити за допомогою папок, що витягуються? Я просто намагався не пощастило, навіть враховуючи замовлення декларації.
trevor-e

7
Приємно! Пам'ятайте лише, що ви реально використовуєте лише здатність gradle до об'єднання папок ресурсів, і це матиме сенс.
eski

5
Імена файлів у папці все ще повинні бути унікальними, і в коді ви повинні знати, що, наприклад R.layout.list_item, походить з папки moviesабо з cinemasпапки, тому плоскі імена все ще застосовуються.
TWiStErRob

5
На жаль, це не працює для мене з build:gradle:0.14.4і buildToolsVersion "21.1.1".
Каміль Лелонек

32
Це працює, однак відповідь виконує жахливо неадекватну роботу, пояснюючи, що кожна додана вами вкладена папка повинна мати другу підпапку, яку можна назвати лише "макет", і всі ваші файли компонування повинні зайти всередину друга підпапка (и). Читання десятків коментарів для роботи, що далеко не ідеальне. А для тих, хто все ще шукає, налаштування додаткових папок «макет» - це рішення URI is not registeredпроблеми.
1616

233

Відповідь - ні.

Я хотів би звернути вашу увагу на цю книгу Pro Android 2, в якій сказано:

Варто також зазначити кілька обмежень щодо ресурсів. По-перше, Android підтримує лише лінійний список файлів у попередньо визначених папках у розділі res. Наприклад, він не підтримує вкладені папки в папці макета (або інших папок у розділі res).

По-друге, існують деякі подібності між папкою активів та необробленою папкою у розділі res. Обидві папки можуть містити необроблені файли, але файли всередині сировини вважаються ресурсами, а файли в активах - ні.

Зауважте, що оскільки вміст папки активів не вважається ресурсами, ви можете розмістити в ній довільну ієрархію папок і файлів .


3
Я гостям, що наступним найкращим надією буде плагін Eclipse або IntelliJ, який може згортати файли на основі префіксів імен файлів.
Джеррі Брейді

15
@Justin ознайомтеся з рішенням, яке я розмістив для gradle.
eski

Я думаю, що одним із варіантів рішення може бути названня файлів так, як ви хотіли б, щоб вони були категоризованими, так що, схоже, це є в підпапках. Я додаю "тег підпапки" до початку імені. Наприклад. усі види діяльності будуть "Activity_activityname.xml", а дитяча активність може бути "activity_activityname_childactivity.xml" тощо. Будь-який інший файл буде "other_filename.xml". Це я роблю, щоб уникнути плутанини. Чорт, хтось мене до цього побив. До трьох років>. <Моє погано, не бачив цього.
Vedavyas Bhat

1
Тут важливо зауважити, що, розглядаючи rawяк ресурси, ви отримуєте залежність від щільності / орієнтації / версії / тощо, в той час як з assetsвами це потрібно робити вручну.
TWiStErRob

1
Вибрали цю відповідь як аргумент проти фігури Android-мейнстріму.
Зона

77

Я просто хотів додати фантастичну відповідь ескізів для людей, які мають проблеми. (Примітка. Це працюватиме лише як і виглядатиме як окремі каталоги всередині "проекту", а не "android").

Перевірено з наступним. BuildToolsVersion = 23.0.0 ступінь 1.2.3 та 1.3.0

Ось як я змусив мене працювати з уже побудованим проектом.

  1. Скопіюйте всі файли XML із каталогу вашого макета та покладіть їх у каталог на робочому столі або щось для резервного копіювання.
  2. Видаліть увесь каталог макетів (переконайтесь, що ви створили резервну копію все з кроку 1 !!!)
  3. Клацніть правою кнопкою миші каталог дозволу та виберіть новий> каталог.
  4. Назвіть цей новий каталог "макети". (Це може бути все, що завгодно, але це буде не каталог "фрагментів" або каталог "активності", який з’явиться пізніше).
  5. Клацніть правою кнопкою миші новий каталог "макетів" і виберіть новий> каталог. (Це буде назва типу файлів XML, які ви матимете в ньому, наприклад, "фрагменти" та "дії").
  6. Клацніть правою кнопкою миші каталог "фрагмент" або "діяльність" (Примітка: це не повинно бути "фрагмент" або "діяльність", це якраз те, що я використовую як приклад) і знову виберіть новий каталог і назвіть цей каталог "макет". (Примітка. ЦЕ ОБОВ'ЯЗКОВО назвати "макет" !!! дуже важливо).
  7. Помістіть потрібні файли XML всередину нового каталогу "макет" із резервної копії, зробленої на робочому столі.
  8. Повторіть кроки 5 - 7 для тих самих спеціальних каталогів, скільки ви хочете.
  9. Після цього закінчіть свій модуль у файлі gradle.build та створіть таке визначення SourceSets, як це ... (Переконайтесь, що 'src / main / res / layout' & 'src / main / res' завжди є двома нижчими !! !! Як я показую нижче).

    sourceSets {
        main {
            res.srcDirs =
                    [
                            'src/main/res/layouts/activities',
                            'src/main/res/layouts/fragments',
                            'src/main/res/layouts/content',
                            'src/main/res/layouts',
                            'src/main/res'
                    ]
        }
    }
  10. Прибуток $$$$

Але серйозно .. ось так я змусив його працювати. Повідомте мене, якщо у когось є питання. Я можу спробувати допомогти.

Картини варті більше, ніж слова.

Структура каталогів


1
Що з такими каталогами макета, як layout-v21?
Акшай Чордія

4
Я цього не перевіряв, але я б уявив, що ви просто створите папку layout-v21 поряд з папками макета.
hitch.united

Працює на gradle 2.0.0 та buildToolsVersion 23.0.2! Зауважте, що значення config є 'src/main/res/layouts/content'і шлях цього конфігурації'src/main/res/layouts/content/layout'
cwhsu

3
У мене проблеми з цим stackoverflow.com/questions/41934004/…
Петра Барус

2
Нещодавно шукали, не пощастивши, це єдине рішення, яке працювало для мене. Дякуємо, що опублікували таку детальну відповідь із зображеннями!
Машинне плем'я

53

Неможливо, але папка компонування сортується за назвою. Отже, я додаю назви файлів макета з іменами моїх пакетів. Напр. Для двох пакетів "купівля" та "гра":

buying_bought_tracks.xml
buying_buy_tracks.xml
playing_edit_playlist.xml
playing_play_playlist.xml
playing_show_playlists.xml

20

Я використовую плагін Android File Grouping для Android Studio. Він насправді не дозволяє створювати підпапки, але він може ВІДКРИТИ свої файли та ресурси так, як вони знаходяться в різних папках. І це саме те, що я хотів.

Ви можете встановити плагін "Групування файлів Android" за допомогою

Windows:

Android Studio -> Файл -> Налаштування -> Плагіни.

Мак:

Android Studio -> вкладка Android Studio (вгорі зліва) -> Налаштування -> Плагіни -> Встановити плагін JetBrains ..

Для Mac я зміг її протестувати і не зміг шукати плагін. Тому я завантажив плагін звідси і використав Install plugin from diskопцію з наведених вище параметрів.


Також поділіться посиланням цього плагіна!
Paresh Mayani

Зроблено. Завжди ви можете шукати "Групування файлів Android" в Android Studio -> Файл -> Налаштування -> Плагіни
Sharpe

3
плагін не працював у режимі перегляду "Android", лише "Project" Перегляд: /
Hugo Gresse

18

Тепер за допомогою Android Studio і Gradle ви можете мати кілька папок ресурсів у своєму проекті. Дозволяє організовувати не тільки файли макета, але й будь-які ресурси.

Це не зовсім підпапка, але вона може розділяти частини вашої програми.

Конфігурація така:

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

Перевірте документацію .


2
Я помітив, що кожного разу, коли я вносив зміни в макет під цим налаштуванням, мені завжди доводилося робити те, cleanщоб це відображалось на додатку.
Pawan Kumar

16

Я думаю, що найелегантніше рішення цієї проблеми (зважаючи на те, що підпапки не дозволені) - це додавання назв файлів до імені папки, в яку ви б розмістили її всередині. Наприклад, якщо у вас є купа макетів для активності, фрагмента або просто загального вигляду під назвою "місця", вам слід просто додати його до імені місця_ми_лаут__. Принаймні, це вирішує проблему їх організації таким чином, щоб їх було легше знайти всередині IDE. Це не найдивовижніше рішення, але це краще, ніж нічого.


16

Мала проблема

Я в змозі досягти підпапок, дотримуючись основної відповіді на це питання.

Однак, коли проект зростає, у вас буде багато підпапок:

sourceSets {
    main {
        res.srcDirs =
            [
                    'src/main/res/layouts/somethingA',
                    'src/main/res/layouts/somethingB',
                    'src/main/res/layouts/somethingC',
                    'src/main/res/layouts/somethingD',
                    'src/main/res/layouts/somethingE',
                    'src/main/res/layouts/somethingF',
                    'src/main/res/layouts/somethingG',
                    'src/main/res/layouts/somethingH',
                    'src/main/res/layouts/...many more',
                    'src/main/res'
            ]
    }
}

Не велика проблема, але:

  • це не дуже красиво, оскільки список стає дуже довгим.
  • ви повинні змінювати app/build.gradleкожен раз, коли ви додаєте нову папку.

Поліпшення

Тому я написав простий метод Groovy, щоб схопити всі вкладені папки:

def getLayoutList(path) {
    File file = new File(path)
    def throwAway = file.path.split("/")[0]
    def newPath = file.path.substring(throwAway.length() + 1)
    def array = file.list().collect {
        "${newPath}/${it}"
    }
    array.push("src/main/res");
    return array
}

Вставте цей метод поза android {...}блоком у вашому app/build.gradle.


Як користуватись

Для такої структури:

<project root>
├── app <---------- TAKE NOTE
├── build
├── build.gradle
├── gradle
├── gradle.properties
├── gradlew
├── gradlew.bat
├── local.properties
└── settings.gradle

Використовуйте його так:

android {
    sourceSets {
        main {
            res.srcDirs = getLayoutList("app/src/main/res/layouts/")
        }
    }
}

Якщо у вас така структура:

<project root>
├── my_special_app_name <---------- TAKE NOTE
├── build
├── build.gradle
├── gradle
├── gradle.properties
├── gradlew
├── gradlew.bat
├── local.properties
└── settings.gradle

Ви будете використовувати його так:

android {
    sourceSets {
        main {
            res.srcDirs = getLayoutList("my_special_app_name/src/main/res/layouts/")
        }
    }
}

Пояснення

getLayoutList()бере a relative pathаргумент. relative pathЄ відносно кореня проекту. Отже, коли ми введемо "app/src/main/res/layouts/", він поверне ім'я всіх папок у вигляді масиву, який буде точно таким же, як:

            [
                    'src/main/res/layouts/somethingA',
                    'src/main/res/layouts/somethingB',
                    'src/main/res/layouts/somethingC',
                    'src/main/res/layouts/somethingD',
                    'src/main/res/layouts/somethingE',
                    'src/main/res/layouts/somethingF',
                    'src/main/res/layouts/somethingG',
                    'src/main/res/layouts/somethingH',
                    'src/main/res/layouts/...many more',
                    'src/main/res'
            ]

Ось сценарій із коментарями для розуміння:

def getLayoutList(path) {
    // let's say path = "app/src/main/res/layouts/
    File file = new File(path)

    def throwAway = file.path.split("/")[0]
    // throwAway = 'app'

    def newPath = file.path.substring(throwAway.length() + 1) // +1 is for '/'
    // newPath = src/main/res/layouts/

    def array = file.list().collect {
        // println "filename: ${it}" // uncomment for debugging
        "${newPath}/${it}"
    }

    array.push("src/main/res");
    // println "result: ${array}" // uncomment for debugging

    return array
}

Сподіваюся, це допомагає!


Я використовував ваш підхід, але як його використовувати в діяльності? Я створив підпапку в папці макетів під назвою admin, і вона має макет admin_home, коли я перебуваю в активності та користуванні setContentView(R.layout.Admin.admin_home .)Admin.admin_home не вирішено
Asmaa Rashad

Ви повинні мати можливість нормально користуватися нею R.layout.admin_home. Сценарій повинен мати можливість автоматично підібрати імена для вас. Дайте мені знати, чи можете ви змусити його працювати.
Я жаб'ячий дракон

вона працює добре , але після того, як змінити цю рядок , array.push("src/main/res");щоб , def res="src/main/res"; array.push(res);тому що у мене є помилки , як поштовху хоче параметр GSTRING НЕ Струнний один .if будь-якого , а не я знайшов цю помилку можна змінити його
Асм Рашад

1
Макети в підпапках не в змозі вирішити простір імен для Android. Будь-які ідеї?
Ягуар

Чи можете ви скаментувати ці рядки // uncomment for debuggingта перевірити, чи src/main/res/layouts/<your_layout_files>правильно виявлені виходи ?
Я жаба-дракон

15

Тепер ми можемо легко зробити плагін JetBrains під назвою " Групування файлів Android "

перегляньте це посилання

Групування файлів Android

введіть тут опис зображення


Повинна бути позначена як правильна відповідь, оскільки організувати групування можна лише простим іменем. Не потрібно змінювати ступінь або навіть структуру каталогів програми за замовчуванням. Весь макет досі залишається у папці макета, але згрупований уAndroid Studio
Аліреза Фаттахі

1
Не слід приймати відповідь, оскільки це не працює в режимі перегляду Android .... (але мені подобається ідея ^^)
Appyx

Це не працює для останньої останньої версії Android ... чи є будь-яка оновлена ​​версія?
користувач3053247

7

Я так це створив окрему папку res на тому ж рівні, що і фактична папка res у вашому проекті, тоді ви можете використовувати це у своїх програмах build.gradle

android {
    //other stuff

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

Приклад структури папки

то кожна вкладена ваших нових рез папка може бути що - то ставлення до кожного конкретного екрану або що - то в вашому додатку, і кожна папка матиме свої власні layout/ drawable/ і valuesт.д. тримати речі організовані і ви не повинні оновити Gradle файл вручну , як деякі з цих інших відповіді вимагають (Просто синхронізуйте свій gradle кожен раз, коли ви додаєте нову папку ресурсів, щоб вона знала про неї, і обов’язково додайте відповідні папки, перш ніж додавати файли xml).


4

Позначте сценарій Bash Flatten Folder, який перетворює ієрархію папок в одну папку


Перевіримо це незабаром. Спасибі
Paresh Mayani

1
Цей сценарій змінює ім'я файлу, щоб включати ієрархію каталогів у ім'я файлу. Як це буде працювати з вашим Android IDE, якщо імена файлів змінюються всюди?
Стелс-раббі

3

Якщо ви розробляєте Linux або mac box, вирішенням буде створення підпапок, які містять символьні посилання на ваші макети. Просто використовуйте команду ln з -s

ln -s PATH_TO_YOUR_FILE

Проблема з цим полягає в тому, що папка Layout все ще містить всі файли .xml. Але ви можете хоч і вибрати їх за допомогою підпапок. Це найближче до того, що ви хотіли б мати.

Я щойно прочитав, що це може працювати і з Windows, якщо ви використовуєте Vista чи новішу версію. Є ця mklinkкоманда. Просто google це, ніколи не використовував його сам.

Інша проблема полягає в тому, що якщо у вас відкритий файл і спробуйте відкрити його знову, плагін викидає виняток NULL Pointer. Але не зависає.


1
Поставлення символьної посилання перемагає мета модулювання зберігання, розділяючи компоненти в різні підкаталоги: ефективно роблячи її складнішою, а не меншою. Gradle дозволяє специфікувати додаткові каталоги ресурсів.
RichieHH

3

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

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


Я згоден з вами, що AS не відзначає зміни у файлах XML. Але яке рішення? Я спробую stackoverflow.com/questions/32317822/… .
CoolMind

3

Верхня відповідь від @eski хороша, але код не елегантний у використанні, тому я написав groovy скрипт у 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 як звичайні для малювання.


Це слід вважати правильною відповіддю! Простий та ідеально працює!
Gláucio Leonardo Sant'ana

2

Якщо ви використовуєте метод у затвердженій відповіді та хочете трохи його вдосконалити, то змініть налаштування градації таким чином:

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

Тож якщо ви додасте більше папок і макетів, вам не потрібно повертатися сюди і додавати довгий список вихідних папок, нехай gradle отримує всі папки для вас.


1
  • Крок 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: Підсумок: Усі кроки, описані вище, допоможуть лише згрупувати папки та відобразити їх у режимі «проект», а режим «андроїд» відобразиться як звичайний.
  • Тож я малюю, що можливо іменування префіксів настільки ж ефективно, як і кластеризація папок.

Дякую за Projectрежим Я не міг зрозуміти, куди зникли папки (в Androidрежимі).
CoolMind

0

Ну, коротка відповідь - ні. Але ви, безумовно, можете мати кілька resпапок. Я думаю, це так близько, як ви можете отримати до папки для layoutпапки. Ось як ви це робите.


1
Перевірте прийняту відповідь. Я не пробував це особисто, але якщо ви можете перевірити та оновити, то це буде корисно!
Paresh Mayani

0

Топ відповідей має ряд недоліків: вам потрібно додати нові контури макета, 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-файлів (особливо під час виконання). Іноді він змішує view ids (посилання на інший XML-файл). Часто потрібно натиснути Build > Clean Projectабо Build > Rebuild Project. Прочитайте необхідну перебудову після зміни файлів макета xml в Android Studio .


Ваш коментар "Я створив папки з цією статтею (додається посилання)" - це неприйнятний спосіб надати рішення тут, ТАК Ваша відповідь нечітка. Ви можете залишити вказівки та доручити автору посилання. Інакше це просто ледачий.
jungledev

@jungledev, ну, нарешті, я відмовився від цієї ідеї і повернувся до традиційної resпапки, оскільки AS не повністю підтримує розподіл ресурсів на папки. Напевно, я зміню цю відповідь або навіть видалю. Але що ви маєте на увазі, кажучи, що це неприйнятний спосіб надати рішення тут на ЗП?
CoolMind

Я маю на увазі саме те, що я сказав. Не кажіть: "Я зробив це за допомогою цього підручника .... (вставте посилання)." Що ви повинні сказати: "Я дотримувався цього підручника (вставте посилання), і ось кроки, які працювали для мене. Крок 1, крок 2, крок 3 ... і т. Д." Ви повинні включити кроки ТУТ у відповідь. Просто посилання на підручник неприйнятно.
jungledev

0

Не можна (легко) мати підкаталоги, але у вас можуть бути додаткові папки ресурсів. Здивований, про це вже ніхто не згадував, але щоб зберегти папки ресурсів за замовчуванням , і додайте ще кілька:

    sourceSets {
        main.res.srcDirs += ['src/main/java/XYZ/ABC']
    }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.