В прошлой теме было рассмотрено, как выводить массив строк с помощью 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);
}
}
А результат будет тот же самый: