Ресурс Android - массив массивов
Я пытаюсь реализовать структуру данных ресурсов, которая включает в себя массив массивов, в частности строки. Проблема, с которой я сталкиваюсь, заключается в том, как получить объекты sub-array и их конкретные значения. Вот как выглядит мой файл ресурсов....
<resources>
<array name="array0">
<item>
<string-array name="array01">
<item name="id">1</item>
<item name="title">item one</item>
</string-array>
</item>
<item>
<string-array name="array02">
<item name="id">2</item>
<item name="title">item two</item>
</string-array>
</item>
<item>
<string-array name="array03">
<item name="id">3</item>
<item name="title">item three</item>
</string-array>
</item>
</array>
</resources>
Затем в моем Java-коде я извлекаю массив и пытаюсь получить доступ к таким элементам, как это...
TypedArray typedArray = getResources().obtainTypedArray(R.array.array0);
TypedValue typedValue = null;
typedArray.getValue(0, typedValue);
В этот момент объект typedArray должен представлять массив массивов "array01", однако я не вижу, как извлекать строковые элементы "id" и "title". Любая помощь была бы оценена, спасибо заранее.
Ответы
Ответ 1
Вы можете почти делать то, что хотите. Вы должны объявлять каждый массив отдельно, а затем массив ссылок. Что-то вроде этого:
<string-array name="array01">
<item name="id">1</item>
<item name="title">item one</item>
</string-array>
<!-- etc. -->
<array name="array0">
<item>@array/array01</item>
<!-- etc. -->
</array>
Затем в вашем коде вы делаете что-то вроде этого:
Resources res = getResources();
TypedArray ta = res.obtainTypedArray(R.array.array0);
int n = ta.length();
String[][] array = new String[n][];
for (int i = 0; i < n; ++i) {
int id = ta.getResourceId(i, 0);
if (id > 0) {
array[i] = res.getStringArray(id);
} else {
// something wrong with the XML
}
}
ta.recycle(); // Important!
Ответ 2
в соответствии с ответом @Ted Hopp, более элегантным способом:
<integer-array name="id_array">
<item>1</item>
<item>2</item>
<item>3</item>
</integer-array>
<string-array name="name_array">
<item>name 1</item>
<item>name 2</item>
<item>name 3</item>
</string-array>
<array name="array0">
<item>@array/id_array</item>
<item>@array/name_array</item>
</array>
убедитесь, что подсчет строк подматрицы идентичен.
наслаждайтесь писать код для доступа к ячейкам массива!
Андроид по-прежнему остается ребенком, сохраняя уродливый тег "item" массива TypedArray "array0".
на мой взгляд, наиболее гибким должно быть:
<array name="array0">
<integer-array name="id_array">
<item>1</item>
<item>2</item>
<item>3</item>
</integer-array>
<string-array name="name_array">
<item>name 1</item>
<item>name 2</item>
<item>name 3</item>
</string-array>
</array>
но не делайте этого, потому что это не способ android:)
Ответ 3
https://developer.android.com/guide/topics/resources/more-resources.html#Color
<?xml version="1.0" encoding="utf-8"?>
<resources>
<array name="icons">
<item>@drawable/home</item>
<item>@drawable/settings</item>
<item>@drawable/logout</item>
</array>
<array name="colors">
<item>#FFFF0000</item>
<item>#FF00FF00</item>
<item>#FF0000FF</item>
</array>
</resources>
Этот код приложения извлекает каждый массив, а затем получает первую запись в каждом массиве:
Resources res = getResources();
TypedArray icons = res.obtainTypedArray(R.array.icons);
Drawable drawable = icons.getDrawable(0);
TypedArray colors = res.obtainTypedArray(R.array.colors);
int color = colors.getColor(0,0);
Ответ 4
Array не является парой имя/значение. Вы можете получить доступ к элементам по номерам. Синтаксис в xml неверен. Это должно быть так:
<string-array name="string_array_name">
<item>text_string1</item>
<item>text_string2</item>
</string-array>