Как получить 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);
}