У меня было похожее требование, и я решил его таким образом, что более мощен , чем текущие решения.
Сначала создайте ресурс, который является массивом массивов стран:
<array name="countries_array_of_arrays">
<item>@array/es</item>
<item>@array/it</item>
</array>
Затем для каждой страны добавьте массив с информацией о стране:
<array name="es">
<item>ES</item>
<item>ESPAÑA</item>
</array>
<array name="it">
<item>IT</item>
<item>ITALIA</item>
</array>
Некоторые примечания:
Значения name
(Да, это) в каждом массиве страны должны соответствовать значениям в countries_array_of_arrays
(в противном случае вы получите сообщение об ошибке).
Порядок элементов в каждом массиведолжно быть одинаковым для всех массивов.Поэтому всегда сначала ставьте код страны, а затем, например, название страны.
Вы можете иметь любое количество строк для каждой страны, а не только код страны и название.
Чтобы загрузить строки в вашем коде, сделайте следующее:
TypedArray countriesArrayOfArrays = getResources().obtainTypedArray(R.array.countries_array_of_arrays);
int size = countriesArrayOfArrays.length();
List<String> countryCodes = new ArrayList<>(size);
List<String> countryNames = new ArrayList<>(size);
TypedArray countryTypedArray = null;
for (int i = 0; i < size; i++) {
int id = countriesArrayOfArrays.getResourceId(i, -1);
if (id == -1) {
throw new IllegalStateException("R.array.countries_array_of_arrays is not valid");
}
countryTypedArray = getResources().obtainTypedArray(id);
countryCodes.add(countryTypedArray.getString(0));
//noinspection ResourceType
countryNames.add(countryTypedArray.getString(1));
}
if (countryTypedArray != null) {
countryTypedArray.recycle();
}
countriesArrayOfArrays.recycle();
Здесь я загружаю ресурсы в 2 List
, но вы можете использовать Map
, есливы хотите.
Почему это мощнее?
Позволяет использовать строковые ресурсы и, следовательно, переводить названия стран для разных языков.
Позволяет связывать любой тип ресурса с каждой страной, а не только со строками.Например, вы можете связать @drawable
с флагом страны или <string-array>
, который содержит провинции / штаты для страны.
Расширенный пример:
<array name="it">
<item>IT</item>
<item>ITALIA</item>
<item>@drawable/flag_italy</item>
<item>@array/provinces_italy</item>
</array>
Обратите внимание, что я не пробовал это, но я видел это в других вопросах .В таком случае вы можете использовать countryTypedArray.getDrawable(2)
, например, для получения отрисовки.
Упрощение:
Если вы используете только строки для массива страны, вы можетеиспользуйте <string-array
(вместо <array>
) следующим образом:
<string-array name="it">
<item>IT</item>
<item>ITALIA</item>
</string-array>
И вы можете немного упростить код цикла for, непосредственно получив String[]
вместо TypedArray
:
String[] countryArray = getResources().getStringArray(id);
countryCodes.add(countryArray[0]);
countryNames.add(countryArray[1]);
Примечание о наличии 2 <string-array>
:
Изначально я думал о том, чтобы иметь 2 <string-array>
(один для кода страны и другой дляназвание страны), как указано в другом ответе.Однако при 2 <string-array>
вы должны убедиться, что порядковые номера элементов и совпадают.С этим решением вы не делаете.В этом отношении безопаснее.Обратите внимание, что, как я уже сказал, порядок элементов в каждом массиве стран имеет значение: всегда ставьте код страны и название страны в одном порядке!