Как получить 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);
когда countries_array как
<resources>
<string-array name="countries_array">
<item>Bahrain</item>
<item>Bangladesh</item>
<item>India</item>
</string-array>
</resources>
2 ответов
на <string-array>
элемент файла ресурсов может использоваться только для массивов с одним измерением. Другими словами, все между <item>
и </item>
считается одной строкой.
если вы хотите хранить данные так, как вы описываете (эффективно псевдо-XML), вам нужно будет получить элементы как один String[]
используя getStringArray(...)
и парсить <name>
и <codes>
элементы самостоятельно.
лично я, возможно, пойду с де-ограниченным форматом, таким как...
<item>Bahrain,12345</item>
...тогда просто используйте split(...)
.
кроме того, определить каждого <item>
как JSONObject, например...
<item>{"name":"Bahrain","code":"12345"}</item>
вместо многозначных записей I о подход, где вы можете хранить сложные объекты в виде массива, а затем суффикс имени с инкрементным целым числом. Пройдите через них и при необходимости создайте список строго типизированных объектов.
<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);
}