Робота з ресурсами

Ресурс в застосунку 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);