Ресурс string-array і ListView
У попередній темі було розглянуто, як виводити масив рядків за допомогою ArrayAdapter в ListView. При цьому масив рядків визначався програмно в коді Java. Однак такий масив рядків значно зручніше було б зберігати в XML-файлі як ресурс.
Ресурси масивів рядків представляють елемент типу string-array. Вони можуть знаходитися в каталозі res/values в XML-файлі з будь-яким ім'ям.
Оголошення масивів рядків має наступний синтаксис:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="ім'я_масиву_рядків">
<item>елемент</item>
</string-array>
</resources>
Масив рядків задається за допомогою елемента <string-array>, атрибут name якого може мати будь-яке значення, по якому потім будуть звертатися до цього масиву. Усі елементи масиву представляють набір значень <item>.
Наприклад, додамо до папки res/values новий файл. Для цього натискаємо правою кнопкою миші на цей каталог і в з'явившемся меню вибираємо пункт New -> Value Resource file:

У вікні, що з'явилося, назвемо файл як countries:

Після додавання файлу в папку res/values, змінемо його вміст наступним чином:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="countries">
<item>Бразилія</item>
<item>Аргентина</item>
<item>Колумбія</item>
<item>Чилі</item>
<item>Уругвай</item>
</string-array>
</resources>
У файлі розмітки activity_main.xml залишається визначення елемента ListView:
<?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">
<ListView
android:id="@+id/countriesList"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent">
</ListView>
</androidx.constraintlayout.widget.ConstraintLayout>
Тепер зв'яжемо ресурс і ListView в коді MainActivity:
package com.example.listapp;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// отримуємо елемент ListView
ListView countriesList = findViewById(R.id.countriesList);
// отримуємо ресурс
String[] countries = getResources().getStringArray(R.array.countries);
// створюємо адаптер
ArrayAdapter<String> adapter = new ArrayAdapter(this,
android.R.layout.simple_list_item_1, countries);
// встановлюємо для списку адаптер
countriesList.setAdapter(adapter);
}
}
Для отримання ресурсу в коді Java застосовується вираз R.array.назва_ресурсу.
Нам не обов'язково додавати список рядків в ListView програмно. У цього елемента є атрибут entries, який може приймати ресурс string-array:
<?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">
<ListView
android:id="@+id/countriesList"
android:entries="@array/countries"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent">
</ListView>
</androidx.constraintlayout.widget.ConstraintLayout>
В цьому випадку код MainActivity ми можемо скоротити до стандартного:
package com.example.listapp;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
А результат буде той самий:
