如何从Android的xml字符串资源中检索2D数组?

假设我在Android资源中存储了一个2维数组,如下所示。我如何将它们放入像Arraylist这样的java集合中?

<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>

答案 1

资源文件的元素只能用于单维数组。换句话说,和 之间的所有内容都被视为单个字符串。<string-array><item></item>

如果要以描述的方式(实际上是伪 XML)存储数据,则需要使用和元素自行分析和元素来获取单个项目。String[]getStringArray(...)<name><codes>

就个人而言,我可能会采用一种不受限制的格式,例如...

<item>Bahrain,12345</item>

...然后只需使用.split(...)

或者,将每个对象定义为 JSON 对象,例如...<item>

<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);
}

推荐