Как получить 2D-массив из XML-ресурса для Android?
Предположим, что я сохранил 2-мерный массив в ресурсе android, как показано ниже. Как я могу получить их в коллекции java, например Arraylist?
<resources>
<string-array name="countries_array">
<item>
<name>Bahrain</name>
<code>12345</code>
</item>
<item>
<name>Bangladesh</name>
<code>54545</code>
</item>
<item>
<name>India</name>
<code>54455</code>
</item>
</string-array>
</resources>
Например, в случае 1-мерного массива мы можем сделать это с помощью
getResources().getStringArray(R.array.countries_array);
Когда countrysarray похож на
<resources>
<string-array name="countries_array">
<item>Bahrain</item>
<item>Bangladesh</item>
<item>India</item>
</string-array>
</resources>
Ответы
Ответ 1
Элемент <string-array>
файла ресурсов может использоваться только для одноразмерных массивов. Другими словами, все между <item>
и </item>
считается одной строкой.
Если вы хотите хранить данные так, как вы описываете (эффективно псевдо XML), вам нужно будет получить элементы как один String[]
с помощью getStringArray(...)
и проанализировать элементы <name>
и <codes>
сами.
Лично я мог бы пойти с ограниченным форматом, например...
<item>Bahrain,12345</item>
... тогда просто используйте split(...)
.
В качестве альтернативы определите каждый <item>
как JSONObject, такой как...
<item>{"name":"Bahrain","code":"12345"}</item>
Ответ 2
Вместо многозначных записей я написал о другом, где вы можете хранить сложные объекты в виде массива, а затем суффикс имени с помощью инкрементное целое число. Прокрутите их и создайте список там, где это необходимо, строго типизированных объектов.
<resources>
<array name="categories_0">
<item>1</item>
<item>Food</item>
</array>
<array name="categories_1">
<item>2</item>
<item>Health</item>
</array>
<array name="categories_2">
<item>3</item>
<item>Garden</item>
</array>
<resources>
Затем вы можете создать статический метод для их получения:
public class ResourceHelper {
public static List<TypedArray> getMultiTypedArray(Context context, String key) {
List<TypedArray> array = new ArrayList<>();
try {
Class<R.array> res = R.array.class;
Field field;
int counter = 0;
do {
field = res.getField(key + "_" + counter);
array.add(context.getResources().obtainTypedArray(field.getInt(null)));
counter++;
} while (field != null);
} catch (Exception e) {
e.printStackTrace();
} finally {
return array;
}
}
}
Теперь он может быть использован следующим образом:
for (TypedArray item : ResourceHelper.getMultiTypedArray(this, "categories")) {
Category category = new Category();
category.ID = item.getInt(0, 0);
category.title = item.getString(1);
mCategories.add(category);
}