Робота з ресурсами
Ресурс в застосунку Android представляє собою файл, наприклад, файл розмітки інтерфейсу або деяке значення, наприклад, простий рядок. Тобто ресурси можуть бути файлами розмітки, окремими рядками, звуковими файлами, файлами зображень тощо. Усі ресурси знаходяться в проєкті в каталозі res. Для різних типів ресурсів, визначених у проєкті, у каталозі res створюються підкаталоги. Підтримувані підкаталоги:
- animator/: XML-файли, які визначають анімацію властивостей.
- anim/: XML-файли, які визначають tween-анімацію.
- color/: XML-файли, які визначають список кольорів.
- drawable/: Графічні файли (
.png,.jpg,.gif). - mipmap/: Графічні файли, які використовуються для іконок застосунку під різні роздільні здатності екранів.
- layout/: XML-файли, які визначають інтерфейс користувача застосунку.
- menu/: XML-файли, які визначають меню застосунку.
- raw/: Різні файли, які зберігаються у вихідному вигляді.
- values/: XML-файли, які містять різні значення, що використовуються у застосунку, наприклад, ресурси рядків.
- xml/: Довільні XML-файли.
- font/: Файли із визначеннями шрифтів з розширеннями
.ttf,.otfабо.ttc, або XML-файли, які містять елемент<font-family>.
Загалом ми можемо визначити такі типи ресурсів:
| Ресурс | Каталог проекту | Файл | Елемент у файлі |
|---|---|---|---|
| Рядки | /res/values/ | strings.xml | <string> |
| Plurals | /res/values/ | strings.xml | <plurals> |
| Масиви рядків | /res/values/ | strings.xml або arrays.xml | <string-array> |
| Логічні значення Boolean | /res/values/ | bools.xml | <bool> |
| Кольори | /res/values/ | colors.xml | <color> |
| Список кольорів | /res/color/ | Довільна назва | <selector> |
| Розміри (Dimensions) | /res/values/ | dimens.xml | <dimen> |
| Ідентифікатори ID | /res/values/ | ids.xml | <item> |
| Цілі числа | /res/values/ | integers.xml | <integer> |
| Масив цілих чисел | /res/values/ | integers.xml | <integer-array> |
| Графічні файли | /res/drawable/ | Файли з розширенням jpg або png | - |
| Tween-анімація | /res/anim/ | XML-файл з довільною назвою | <set>, <alpha>, <rotate>, <scale>, <translate> |
| Покадрова анімація | /res/drawable/ | XML-файл з довільною назвою | <animation-list> |
| Анімація властивостей | /res/animator/ | XML-файл з довільною назвою | <set>, <objectAnimator>, <valueAnimator> |
| Меню | /res/menu/ | XML-файл з довільною назвою | <menu> |
| XML-файли | /res/xml/ | XML-файл з довільною назвою | - |
| Бінарні та текстові ресурси | /res/raw/ | Мультимедійні файли (mp3, mp4), текстові або інші файли | - |
| Розмітка графічного інтерфейсу | /res/layout/ | XML-файл з довільною назвою | - |
| Стилі та теми | /res/values/ | styles.xml, themes.xml | <style> |
Наприклад, якщо ми візьмемо стандартний проєкт Android Studio, який створюється за замовчуванням, то в ньому можна побачити наявність декількох папок для різних ресурсів у каталозі res:

За замовчуванням у проєкті створюються каталоги не для всіх типів ресурсів, які можуть використовуватися в Android. Проте, за потреби можна додати до папки res потрібний каталог, а в нього помістити необхідний ресурс.
R.jar, який потім використовується для роботи з ресурсами.Використання ресурсів
Існує два способи доступу до ресурсів: у файлі вихідного коду та у файлі xml.
Посилання на ресурси у коді
Тип ресурсу в такому записі посилається на одне із просторів (вкладених класів), визначених у файлі R.java, які мають відповідні їм типи у xml:
R.drawable(відповідає типуdrawableу xml)R.id(id)R.layout(layout)R.string(string)R.attr(attr)R.plural(plurals)R.array(string-array)
Наприклад, для встановлення ресурсу activity_main.xml як графічного інтерфейсу в коді MainActivity у методі onCreate() використовується такий рядок:
setContentView(R.layout.activity_main);
Через вираз R.layout.activity_main відбувається посилання на ресурс activity_main.xml, де layout — тип ресурсу, а activity_main — ім'я ресурсу.
Посилання на інші ресурси
Аналогічно можна отримати доступ до інших ресурсів. Наприклад, у файлі res/values/strings.xml визначений ресурс app_name:
<resources>
<string name="app_name">ViewApp</string>
</resources>
Цей ресурс посилається на рядок. Щоб отримати доступ до цього ресурсу у коді Java, можна використовувати вираз R.string.app_name.
Доступ у файлі xml
Часто виникає необхідність посилатися на ресурс у файлі xml, наприклад, у файлі, який визначає візуальний інтерфейс, наприклад, у activity_main.xml. Посилання на ресурси в xml файлах мають наступну формалізовану форму: @[ім'я_пакета:]тип_ресурсу/ім'я_ресурсу
- ім'я_пакета — це ім'я пакета, в якому знаходиться ресурс (вказувати необов'язково, якщо ресурс знаходиться в тому ж пакеті).
- тип_ресурсу — це підклас, визначений у класі
Rдля типу ресурсу. - ім'я_ресурсу — ім'я файлу ресурсу без розширення або значення атрибута
android:nameв XML-елементі (для простих значень).
Наприклад, ми хочемо вивести в елемент TextView рядок, який визначений як ресурс у файлі strings.xml:
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/app_name" />
В цьому випадку властивість text отримає значення рядкового ресурсу app_name.
Метод getResources
Для отримання ресурсів у класі Activity ми можемо використовувати метод getResources(), який повертає об'єкт android.content.res.Resources. Але щоб отримати сам ресурс, нам потрібно у отриманого об'єкта Resources викликати один із методів. Декілька з його методів:
getString(): повертає рядок з файлуstrings.xmlза числовим ідентифікатором.getDimension(): повертає числове значення — ресурсdimen.getDrawable(): повертає графічний файл у вигляді об'єктаDrawable.getBoolean(): повертає значенняboolean.getColor(): повертає визначення кольору.getColorStateList(): повертає об'єктColorStateList— набір кольорів.getFont(): повертає визначення шрифта у вигляді об'єктаTypeface.getFloat(): повертає значенняfloat.getLayout(): повертає об'єктXmlResourceParser, пов'язаний з файломlayout.
Це лише деякі методи. Але всі вони як параметр приймають ідентифікатор ресурсу, який потрібно отримати. Коротко розглянемо їх застосування. Візьмемо той самий файл res/values/strings.xml як джерело ресурсів, який у моєму випадку виглядає так:
<resources>
<string name="app_name">ViewApp</string>
</resources>
І змінимо код MainActivity:
package com.example.viewapp;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);
// отримання ресурсів з файлу values/strings.xml
String app_name = getResources().getString(R.string.app_name);
TextView textView = new TextView(this);
textView.setTextSize(30);
textView.setText(app_name);
setContentView(textView);
}
}
Тут, використовуючи метод getResources(), ми отримуємо всі ресурси і потім використовуємо їх для встановлення значень властивостей графічних елементів. При запуску додатку ми побачимо застосування отриманих ресурсів.

Подібним чином ми можемо програмно отримувати й інші ресурси та використовувати їх у додатку. Однак варто зауважити, що в даному випадку нам не потрібно використовувати метод getResources() і взагалі виконувати якісь певні дії для отримання ресурсу, оскільки метод setText() класу TextView підтримує пряме встановлення тексту по ідентифікатору ресурсу:
textView.setText(R.string.app_name);