我有类似的需求,我以比当前解决方案更强大的方式解决了它。
首先创建一个国家数组的资源:
<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>
请注意,我没有尝试过,但我在 other questions 中看到过。例如,在这种情况下,您将使用countryTypedArray.getDrawable(2) 来获取可绘制对象。
简化:
如果您只对国家/地区数组使用字符串,则可以像这样使用<string-array(而不是<array>):
<string-array name="it">
<item>IT</item>
<item>ITALIA</item>
</string-array>
您可以通过直接获取 String[] 而不是 TypedArray 来简化 for 循环代码:
String[] countryArray = getResources().getStringArray(id);
countryCodes.add(countryArray[0]);
countryNames.add(countryArray[1]);
关于拥有 2 个<string-array> 的说明:
最初我想有 2 个<string-array>(一个用于国家代码,另一个用于国家名称),正如另一个答案中提到的那样。但是,对于 2 <string-array>,您必须确保项目的编号 和 顺序匹配。使用此解决方案,您不会。在这方面更安全。请注意,正如我所说,每个国家/地区数组中项目的顺序很重要:始终将国家/地区代码和国家/地区名称放在同一顺序!