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