Ви завжди повинні відділяти ресурси програми на подобі зображень і тексту від коду, щоб ви могли управляти ними незалежно. Ви також повинні надавати альтернативні ресурси для різних конфігурацій пристроїв, групуючи їх у спеціально названих директоріях ресурсів. Під час виконання програми, Android використовує необхідні ресурси, обираючи їх відносно поточної конфігурації системи. Наприклад, ви можете створити альтернативний макет інтерфейсу в залежності від розміру екрану, або інших налаштувань мови. Коли ви винесете ресурси за межі коду, ви зможете отримати доступ до них використовуючи ідентифікатори ресурсів, які генеруються у вашому класу проекту R. Дана стаття показує, як ваш Android проект може підтримувати альтернативні ресурси для різних конфігурацій систем.

Групування ресурсів

Вам необхідно помістити кожен тип ресурсу у відповідну директорію директорії “res” вашого проекту. Наприклад, ось ієрархія для простого проекту:
MyProject/ 
    src/  
        MyActivity.java  
    res/ 
        drawable/  
            graphic.png  
        layout/  
            main.xml 
            info.xml 
        mipmap/  
            icon.png 
        values/  
            strings.xml 
Як можна розглянути в даному прикладі, директорія res/ містить усі ресурси (і піддиректорії): ресурс зображення, два ресурси макетів, директорія mipmap для іконки, і файл текстового ресурсу. Ім'я директорії ресурсів являються важливими і описані далі.

animator/

Файли XML, які визначають анімації властивостей.

anim/

XML файли, які визначають анімації руху. (Анімації властивостей також можуть бути збереженими у даній директорії, але директорія animator/ являється кращим вибором, оскільки їх легше розрізнити).

сolor/

XML файли які визначають список кольорів.

drawable/

Файли бітових масок (.png, .9.png, .jpg, .gif) або XML файли, які компільовані у наступні графічні підтипи ресурсів:
  • бітові маски (Bitmaps);
  • Списки станів;
  • Фігури;
  • Анімовані графічні елементи;
  • інші графічні елементи.

mipmap/

Графічні файли для різних розмірів іконок, які відображаються у вікні запуску.

layout/

XML файли, які визначають інтерфейс користувача.

menu/

XML-файли, які визначають меню програми, на подобі меню опцій, контекстне меню, або підменю

raw/

Звичайні файли зберігання в їхній поточній формі. Для відкриття даних ресурсів за допомогою класу InputStream, викликайте Resources.openRawResource() з переданим їй ідентифікатором ресурсу, який являє собою R.raw.ім'я_файлу. Однак, якщо ви потребуєте доступ до оригінального ім'я файлу і файлової ієрархії, ви можете зберігати ресурси у директорії assets/. Файлам у директорії assets не надаються ідентифікатори, отож ви можете зчитувати їх тільки за допомогою AssetManager.

values/

XML файли, які містять прості значення, на подобі рядків, цілочисельних рядків і кольорів. В той час як XML файли ресурсів у інших директоріях res/ визначають один ресурс, заснований на імені XML-файлу, файли у директорії values/ описують декілька ресурсів. Для файлу у цей директорії, кожен потомок елементу визначають один ресурс. Наприклад елемент створює ресурс R.string, а елемент створює ресурс R.color. Через те, що кожен ресурс визначається у власному XML-елементі, ви можете назвати файл як забажаєте і помістити різні типи ресурсів в один файл. Однак, для ясності, ви можете забажати помістити різні типи ресурсів у окремі файли. Наприклад, ось деякі правила для ресурсів, які ви можете створити у даній директорії:
  • arrays.xml для ресурсів масиву.
  • colors.xml для значень кольорів.
  • dimens.xml для значень розмірів.
  • strings.xml для текстових значень
  • styles.xml для стилів.

xml/

Звичайні файли XML, які можуть бути прочитані під час виконання програми викликаючи метод Resources.getXML(). Деякі файли XML-конфігурацій повинні бути збереженими в даній директорії. Ніколи не зберігайте ресурси прямо у директорії res/ - це спричинить помилки компіляції. Ресурси, які ви зберегли у директоріях, вказаних вище, являються вашими стандартними ресурсами програми. Тобто, дані ресурси визначають дизайн і вміст за умовчанням. Однак, різні типи пристроїв на Android можуть вимагати різні типи ресурсів. Наприклад, якщо пристрій має більший ніж зазвичай екран, в такому випадку вам необхідно забезпечити інший ресурс макету, який використовує переваги додаткової площі екрану. Або ж, якщо пристрій має різні налаштування мови, вам необхідно надати різні ресурси тексту, які містять перекладений текст для вашого інтерфейсу. Для забезпечення цих ресурсів для різних конфігурацій систем, вам необхідно надати альтернативні ресурси, в добавок до стандартних.

Забезпечення альтернативних ресурсів програми

Майже кожна програма повинна постачати альтернативні ресурси для підтримки специфічних конфігурацій пристроїв. Наприклад, ви повинні включити альтернативні графічні ресурси для різних розширень екранів і альтернативні ресурси текстів для різних мов. Під час виконання програми, Android визначає поточну конфігурацію пристрою і завантажує відповідні ресурси для вашої програми. Для постачання специфічних для конфігурацій системи ресурсів, вам необхідно:
  1. Створити нову директорію ресурсу у res/, названу у формі <назва ресурсу>-<спицифікатори_налаштування>:
    • <назва ресурсу> являється ім'ям відповідної стандартної назви директорії
    • <спицифікатори_налаштування> являється ім'ям, який вказує індивідуальну конфігурацію для якої повинен бути використаний даний ресурс.
  2. Збережіть альтернативний фал ресурсу у новій директорії. Файли рeсурсів повинні бути названі так само, як стандартні файли ресурсів.
Ви можете вказати декілька специфікаторів конфігурації, кожен з яких повинен бути розділений символом підкреслення. Ось приклад ієрархії для стандартного і альтернативного ресурсу.
res/ 
    drawable/   
        icon.png 
        background.png    
    drawable-hdpi/  
        icon.png 
        background.png
Специфікатор hdpi вказує, що ресурси у даній директорії призначені для пристроїв з екраном широкої роздільної здатності. Зображення у кожній з цих директорій для графічних ресурсів, повинні мати зображення, які специфічні для кожного типу екрану, але імена файлів являються однаковими. Тому, ідентифікатор ресурсу, який ви використовуєте для посилання на файли icon.png або background.png являються завжди рівними, але система Android обирає версію ресурсу, яка найкраще підходить для поточного пристрою, порівнюючи конфігурацію пристрою з специфікаторами у назві директорії. Android підтримує декілька специфікаторів налаштувань і ви можете використовувати їх у одному імені директорії ресурсу. Далі перелічено доступні специфікатори конфігурацій в порядку, в якому вони повинні з'являтись у іменах директорій, у випадку множинного використання у одному імені.

MCC i MNC

Приклади: mcc310; mcc310-mnc004; mcc208-mnc00 і так далі. Мобільний код країни (MCC), за яким необов'язково повинен вказаний мобільний код мережі (MNC) від SIM-карти пристрою. Наприклад, mcc310 являється кодом США, специфікатор mcc310-mnc-004 являється мережею Verizon у США і mcc208-mnc00 для мережі Orange у Франції. Якщо пристрій використовує радіо-зв'язок (GSM-телефон), дані значення походять від SIM-карти пристрою. Ви можете також використовувати тільки MCC-код (наприклад, для включення специфічних для країни ресурсів). Якщо вам необхідно дізнатись тільки мову — використовуйте специфікатори мови і регіону. Якщо ви вирішили використовувати специфікатори MCC і MNC, ви повинні використовувати їх з обережністю і тестувати їх, щоб впевнитись що все працює, як очікується.

Регіон і мова

Приклади: en; fr; en-rUS; fr-rFR; fr-rCA. Специфікатор мови, який визначений за двох літерним стандартом ISO 649-1, за якими необов'язково вказується дві літери регіону за стандартом стандарту ISO 3166-1-alpha-2 (перед якими стоїть буква “r”). Коди не являються регістрово чутливими, префікс “r” вказується для розрізняння частини регіону. Ви не можете вказувати тільки код регіону. Дане налаштування системи може змінитися під час використання програми, якщо користувач змінить його мову на іншу.

Напрямок макету.

Значення: ldrtl, ldltr. Напрямок макету вашої програми. Значення ldrtl означає “layout-durection-right-to-left”. Значення ldltr означає “layour-direction-left-to-right” і являється значенням за умовчанням.

Найменша ширина

Синтаксис: sw<N>dp. Приклади: sw320dpm sw600dp, sw720dp. Фундаментальний розмір екрану, який визначається найменшим розміром для доступної площі екрану. Ви можете використовувати даний специфікатор, незалежно від поточної орієнтації екрану. Ваша програма має хоча б ширину в <N>, для її доступної UI. Тобто, показник smallestWidth не змінюється коли змінюється орієнтація екрану. Наприклад, якщо ваш макет інтерфейсу вимагає, щоб найменший розмір крану повинен бути завжди у 600 dp, в такому разі, ви можете використати даний специфікатор для назви макету у вигляді “res/layout-sw600dp/”. Коли ваша програма містить декілька ресурсів з різними значеннями для специфікатора smallestWidth, система буде використовувати макет, який знаходиться найближче до показника smallestWidth пристрою (не перевищуючи його).

Доступна ширина

Синтаксис: w<N>dp. Приклади: w720dp, w1024dp. Вказує мінімальну доступну ширину екрану у одиницях dp, в яких ресурс повинен бути використаним. Дане значення конфігурації буде змінюватись, коли змінюється орієнтація екрану. Коли програма містить декілька директорій ресурсів з різними значеннями конфігурацій, система використовує найближчий до поточної ширини екрану (без його перевищення). Дане значення бере до уваги декорації екрану, отож, якщо пристрій має декілька постійних візуальних елементів зліва або з права екрану, система використовує значення для ширини, яка є меншою, ніж справжня ширина екрану, враховуючи дані візуальні елементи і зменшуючи доступний простір екрану.

Доступна висота

Синтаксис: h<N>dp. Приклади: h720dp, h1024dp. Вказує мінімальну доступну висоту екрану у одиницях dp, при яких повинен використовуватись даний ресурс. Дане значення конфігурації змінюється коли змінюється орієнтація екрану.

Розмір екрану

Значення: small, normal, large, xlarge. small: екран, який має подібний розмір до екранів QVGA. Мінімальний розмір макету для малого екрану приблизно складає 320x426 одиниць dp. normal: екран, який має подібний розмір до середнього розміру екранів HVGA. Мінімальний розмір макету для нормального розміру екрану складає приблизно 320x470 одиниць dp. large: Екрани, які мають подібний розмір до середніх екранів VGA. Мінімальний розмір макету для великих (large) екранів складає 480x640 одиниць dp. xlarge: Екрани, які являються більшими, ніж традиційні екрани середнього розміру. Мінімальний розмір макету для екрану xlarge складає 720x960 одиниць dp. У більшості випадків, пристрої з розміром екрану xlarge, будуть завеликими, щоб тримати їх у кишені і найчастіше вони являються планшетами.

Довжина екрану

Значення: long, notlong. long: довгі екрани на подобі WQVGA, WVGA, FWVGA. notlong: не довгі екрани на подобі QVGA, HVGA i VGA. Даний показник не залежить від орієнтації екрану.

Круглий екран

Значення: round, notround. round: Круглі екрани, на подобі круглих пристроїв, які розміщуються на тілі (годинник). notround: Чотирикутний екран, на подобі телефонів або планшетів.

Орієнтація екрану

Значення: port, land. port: Пристрій має книжну орієнтацію (вертикальна). land: Пристрій має альбомну орієнтацію (горизонтальну). Даний показник може змінюватись протягом життєвого циклу вашої програми.

Режим інтерфейсу

Значення: car, desk, television, appliance, watch. car: Пристрій розміщується на автомобільній станції. desk: Пристрій знаходиться на настільній станції. television: Пристрій відображається на екрані телевізора — користувач знаходиться далеко від нього, і дисплей має великий розмір. appliance: Пристрій знаходиться на приладі без дисплею. watch: пристрій має екран і носиться на зап'ясті. Даний показник може змінюватись під час життєвого циклу програми, якщо користувач поміщає пристрій у станцію. Ви можете увімкнути, або вимкнути деякі з цих режимів за допомогою UiModeManager.

Нічний режим

Значення: night, notnight. night: Нічний режим. notnight: Денний режим пристрою. Даний показник може змінюватись під час виконання вашої програми.

Кількість точок на дюйм (dpi)

Значення: ldpi, mdpi, hdpi, xhdpi, xxhdpi, xxxhdpi, nodpi, tvdpi. ldpi: Екрани з малою роздільною здатністю. mdpi: Екрани з середньою роздільною здатністю (на традиційних HVGA), приблизно 160dpi. hdpi: Екрани з високою роздільною здатністю, приблизно 240dpi. xhdpi: Екрани з роздільною здатністю приблизно у 320dpi xxhdpi: Екрани з приблизною роздільною здатністю у 480dpi. xxxhdpi: екрани з роздільною здатністю приблизно у 640dpi. nodpi: даний специфікатор може використовуватись для ресурсів bitmap, які не повинні змінювати свій розмір. tvdpi: екрани з роздільною здатністю між mdpi i hdpi.

Тип екранного сенсору

Значення: notouch, finger. notouch: Пристрій немає екранного сенсору. finger: пристрій має екранний сенсор, який призначений для прямої взаємодії з користувачем.

Доступність клавіатури

Значення: keysexposed, keyshidden, keyssoft. keysexposed: Пристрій має доступну клавіатуру. Якщо пристрій має увімкнену програмну клавіатуру. keyshidden: Пристрій має доступну фізичну клавіатуру, але вона являється прихованою і пристрій немає увімкнену програмну клавіатуру. keyssoft: Пристрій має увімкнену програмну клавіатуру.

Головний метод вводу тексту

Значення: nokeys, qwerty, 12key/ nokeys: пристрій не має апаратну клавіатуру для вводу тексту. qwerty: Пристрій має апаратну qwerty-клавіатуру. 12key: пристрій має 12 клавішну клавіатуру.

Доступність навігації

Значення: navexposed, navhidden. navexposed: Клавіші навігації доступні для користувача. navhidden: Клавіші навігації недоступні. Даний показник може змінюватись під час виконання програми.

Головний безсенсорний метод навігації

Значення: nonav, dpad, trackball, wheel. nonav: пристрій немає навігаційних можливостей відмінних від сенсору екрану. dpad: Пристрій має сенсорну панель (d-pad) для навігації. trackball: Пристрій має для trackball навігації. wheel: Пристрій має коліщатко напряму для навігації.

Версія API платформи.

Приклади: v3, v4, v7. Рівень API, який підтримується пристроєм. Наприклад, v1 для API рівня 1 (пристрій з Android версії 3 або вище).

Правила імен специфікаторів

Далі надаються деякі правила для використання специфікаторів конфігурації:
  • ви можете вказувати декілька специфікаторів для одного ресурсу відокремленими за допомогою тире. Наприклад “drawable-en-rUS-land” вказується для американських пристроїв з поточною альбомною орієнтацією.
  • Специфікатори повинні бути розміщеними як вказано в вищенаведеному списку. Неправильно: “drawable-hdpi-port”. Правильно: “drawable-port-hdpi”. Альтернативні директорії ресурсів не повинні бути вкладеними. Наприклад, ви не можете мати ієрархію “res/drawale/drawable-en”.
  • Значення являються нечутливими до регістру. Компілятор ресурсів перетворює імена директорій до нижнього регістру перед тим, як обробити їх, для запобігання проблем перед системами, які чутливі до регістру.
  • Тільки один з типів специфікаторів доступний у імені директорії. Наприклад, якщо ви бажаєте використати однаковий графічний ресурс для Іспанії і Франції, ви не можете мати директорію, яка називається drawable-rES-rFR. Замість цього, вам необхідно дві директорії ресурсів, на подобі drawable-rES/ і drawable-rFR/, що містить відповідні файли. Однак, ви також не повинні створювати дві директорії з однаковим ресурсом, але можливо створити синонім для ресурсу.
Після того, як ви збережете альтернативні ресурси у директорії, які містять специфікаторів, Android автоматично застосує усі ресурси для вашої програми, базуючись на поточній конфігурації пристрою.

Забезпечення найкращої сумісності з пристроями за допомогою ресурсів

Для підтримки вашою програмою багатьох конфігурацій пристроїв, важливо, щоб ви завжди надавали ресурси за умовчанням для кожного типу ресурсу, який використовує ваша програма. Наприклад, якщо ваша програма підтримує декілька мов, завжди надавайте директорію values/ (у якій зберігаються ваші ресурси) без специфікаторів мови або регіону. Якщо ви не надасте стандартних значень рядків, ваша програма аварійно завершить свою роботу, якщо не знайдеться ресурсу для поточної мови у ваших директоріях. Але, поки у вас є стандартні ресурси в директорії values/, тоді ваша програма буде правильно працювати (навіть, якщо користувач не розуміє даної мови — це краще ніж аварійне завершення програми). Також, якщо ваша програма надає різні ресурси макетів інтерфейсу, які базуються на орієнтаціях екрану, ви повинні обрати одну орієнтацію екрану в якості стандартної. Наприклад, замість того, щоб вказувати дві директорії ресурсів з різними специфікаторами орієнтації, вкажіть одну в якості стандартної з ім'ям layout, а іншу для книжної орієнтації екрану — layout-port. Забезпечення стандартних ресурсів програми являється важливим не тільки через те, що ваша програма може працювати на пристроях, які не підтримують певні специфікатори, але також нові версії Android інколи додають нові специфікатори, які старі версії системи не підтримують.