Как получить 2D-массив из XML-ресурса для Android? - программирование
Подтвердить что ты не робот

Как получить 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>
4b9b3361

Ответ 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);
}