以下に示すように、2次元配列をAndroidリソースに格納したとします。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);
Countrys_arrayが次のような場合
<resources>
<string-array name="countries_array">
<item>Bahrain</item>
<item>Bangladesh</item>
<item>India</item>
</string-array>
</resources>
リソースファイルの_<string-array>
_要素は、1次元配列にのみ使用できます。つまり、_<item>
_と_</item>
_の間のすべてが単一の文字列と見なされます。
説明した方法(事実上疑似XML)でデータを保存する場合は、getStringArray(...)
を使用してアイテムを単一の_String[]
_として取得し、_<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);
}