Ресурси рядків
Ресурси рядків — один з важливих компонентів додатка. Ми використовуємо їх для виведення назви додатка, різного тексту, наприклад, тексту кнопок тощо.
XML-файли, що представляють собою ресурси рядків, знаходяться в проєкті в папці res/values. За замовчуванням ресурси рядків знаходяться в файлі strings.xml, який може виглядати наступним чином:
<resources>
<string name="app_name">ViewApp</string>
</resources>

У найпростіший спосіб цей файл визначає один ресурс "app_name", який встановлює назву додатка, яку ми бачимо в заголовку додатка на екрані пристрою. Але, звісно, ми можемо визначити будь-які рядкові ресурси. Кожен окремий ресурс визначається за допомогою елемента string, а його атрибут name містить назву ресурсу.
Потім в додатку в файлах коду ми можемо звертатися до цих ресурсів:
R.string.app_name
Наприклад, у коді Java:
String application_name = getResources().getString(R.string.app_name);
Або в xml-файлі:
@string/app_name
Наприклад, змінімо файл res/values/strings.xml наступним чином:
<resources>
<string name="app_name">ViewApp</string>
<string name="message">Hello Android!</string>
</resources>
Тут додано ресурс message зі значенням "Hello Android!".
Тепер використовуємо ресурс у файлі activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/message"
android:textSize="30sp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
За допомогою виразу @string/message передаємо атрибуту android:text значення з ресурсу.

Аналогічно ми могли б використовувати ресурс у коді Activity:
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);
// отримуємо елемент textView
TextView textView = findViewById(R.id.textView);
// переустанавливаем у нього текст
textView.setText(R.string.message);
}
}
Якщо нам взагалі потрібно отримати ресурс у коді Java (не обов'язково для встановлення тексту в TextView), то в цьому випадку можна використовувати метод getResources().getString(ідентифікатор_ресурсу):
String message = getResources().getString(R.string.message);
Хоча за замовчуванням для ресурсів рядків використовується файл strings.xml, розробники можуть додавати додаткові файли ресурсів у каталог проекту res/values. При цьому достатньо дотримуватися структури файлу: він повинен мати кореневий вузол <resources> та один або кілька елементів <string>.
Так, натискаємо на папку res/values правою кнопкою миші та в з'явившомуся списку вибираємо пункт New -> Value Resource File:

Причому слід зазначити, що цей тип файлів буде характерний для будь-якого типу ресурсів, який додається в папку res/values.
Після цього нам буде запропоновано визначити для файлу ім'я:

Назвемо, наприклад, headers (назва файлу довільна), а для всіх інших полів залишимо значення за замовчуванням. І в папку res/values буде додано новий файл headers.xml. Визначимо в ньому пару ресурсів:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="welcome">Добро пожаловать</string>
<string name="click_button">Нажмите на кнопку</string>
</resources>
І після цього ми зможемо використовувати визначені тут ресурси в коді Activity або в файлі layout.
Форматування рядків
Android дозволяє застосовувати форматування до ресурсів рядків. Наприклад, змінимо файл strings.xml:
<resources>
<string name="app_name">ViewApp</string>
<string name="message">Привіт, Android!</string>
<string name="welcome_message">Добро пожаловать %1$s! Уже %2$d : %3$d</string>
</resources>
Третій ресурс — welcome_message представляє рядок з форматуванням. Так, вона містить такі символи як %1$s, %2$d і %3$d. Що вони означають?
%1$sвказує, що це перший аргумент, а символ "s" означає, що цей аргумент є рядком.%2$dпредставляє другий аргумент, а символ "d" в кінці вказує, що це буде ціле число.- Аналогічно,
%3$dвказує, що це третій аргумент, який також є цілим числом.
Отримуємо ресурс в коді Java:
package com.example.viewapp;
import androidx.appcompat.app.AppCompatActivity;
import android.content.res.Resources;
import android.os.Bundle;
import android.widget.TextView;
import java.util.Calendar;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);
String userName = "Євген";
Calendar calendar = Calendar.getInstance();
int hour = calendar.get(Calendar.HOUR_OF_DAY);
int minute = calendar.get(Calendar.MINUTE);
String text = getString(R.string.welcome_message, userName, hour, minute);
TextView textView = new TextView(this);
textView.setText(text);
textView.setTextSize(28);
setContentView(textView);
}
}
Метод getString(R.string.welcome_message, userName, hour, minute) отримує ресурс welcome_message і як наступні параметри передає його аргументам значення. Для першого аргументу-рядка використовується змінна userName, а для другого і третього аргументів передаються поточні години і хвилини, отримані за допомогою класу Calendar.

Ресурси Plurals
Plurals (множинні ресурси) — це ще один тип наборів рядків, які призначені для опису кількості елементів. Це необхідно, наприклад, коли існує зміна закінчення іменника в залежності від числівника, з яким він вживається: 1 квітка, 2 квітки, 5 квіток. Для таких випадків і використовуються ресурси plurals.
Розглянемо приклад. Додамо в папку res/values новий ресурс. Назвемо його flowers:
<resources>
<plurals name="flowers">
<item quantity="one">1 квітка</item>
<item quantity="few">2-4 квітки</item>
<item quantity="many">5 і більше квіток</item>
</plurals>
</resources>
В цьому прикладі ми визначили ресурс flowers, який містить різні форми слова "квітка" в залежності від кількості.
quantity="one"— для числа 1.quantity="few"— для чисел 2, 3 і 4.quantity="many"— для чисел 5 і більше.
Тепер ми можемо використовувати цей ресурс у коді або в XML.

Змінимо його вміст наступним чином:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<plurals name="flowers">
<item quantity="one">%d квітка</item>
<item quantity="few">%d квітки</item>
<item quantity="many">%d квіток</item>
</plurals>
</resources>
Для визначення ресурсу використовується елемент <plurals>, для якого є атрибут name, що отримує значення, яке буде використовуватися для посилання на цей ресурс.
Самі набори рядків вводяться дочірніми елементами <item>. Цей елемент має атрибут quantity, який визначає, коли буде використовуватися відповідний рядок. Атрибут може мати наступні значення:
zero: рядок для кількості, рівної 0.one: рядок для кількості, рівної 1 (для української мови — для всіх кількостей, що закінчуються на 1, крім 11).two: рядок для кількості, рівної 2.few: рядок для невеликої кількості.many: рядок для великих кількостей.other: всі інші випадки.
Зазначимо, що багато чого залежить від конкретної мови, і система автоматично визначає, яке значення брати для того чи іншого числа.
Використання цього ресурсу можливе тільки в коді Java. Тому змінюємо код 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);
String rose = getResources().getQuantityString(R.plurals.flowers, 21, 21);
TextView textView = new TextView(this);
textView.setText(rose);
textView.setTextSize(26);
setContentView(textView);
}
}
За допомогою методу getQuantityString ми отримуємо значення ресурсу. Першим параметром передаємо ідентифікатор ресурсу. Другим параметром йде значення, для якого потрібно знайти відповідний рядок. Третій параметр представляє значення, яке буде вставлене на місце плейсхолдера %d. Тобто ми отримуємо рядок для числа 21.

string array
Ще одним видом строкових ресурсів є string-array або масив рядків. Наприклад, додамо в папку res/values новий файл, який назвемо languages.xml:

Нехай він містить наступний код:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="languages">
<item>Java</item>
<item>Kotlin</item>
<item>Dart</item>
</string-array>
</resources>
Ресурс визначається за допомогою елемента <string-array>. Насправді він визначає набір рядків. Кожен окремий рядок задається за допомогою елемента <item>.
У файлі MainActivity.java визначимо код для отримання значень з цього ресурсу:
package com.example.viewapp;
import androidx.appcompat.app.AppCompatActivity;
import android.content.res.Resources;
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);
Resources res = getResources();
String[] languages = res.getStringArray(R.array.languages);
String allLangs = "";
for (String lang: languages) {
allLangs += lang + " ";
}
TextView textView = new TextView(this);
textView.setText(allLangs);
textView.setTextSize(28);
setContentView(textView);
}
}
За допомогою методу getStringArray отримуємо ресурс у вигляді масиву рядків, а потім за допомогою циклу складаємо з масиву один рядок і передаємо його в TextView.
