20

以下に示すように、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>
4

2 に答える 2

40

<string-array>リソース ファイルの要素は、1 次元配列にのみ使用できます。つまり、 と の間のすべてが 1 つの文字列<item></item>見なされます。

説明した方法でデータを保存したい場合 (事実上疑似 XML)、アイテムを単一のString[]使用として取得し、 and要素を自分getStringArray(...)で解析する必要があります。<name><codes>

個人的には、次のような制限付きの形式を使用する可能性があります...

<item>Bahrain,12345</item>

...その後、使用するだけsplit(...)です。

<item>または、それぞれを次のような JSONObject として定義します...

<item>{"name":"Bahrain","code":"12345"}</item>
于 2012-07-07T17:26:52.400 に答える
6

複数の値を持つエントリの代わりに、複雑なオブジェクトを配列として格納し、名前の末尾に増分整数を付ける別のアプローチについて書きました。それらをループして、必要に応じてそこから厳密に型指定されたオブジェクトのリストを作成します。

<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);
}
于 2015-07-27T20:13:54.897 に答える