Intereting Posts
Com.android.ddmlib.InstallException: не удалось установить сеанс реагирования Environment.getExternalStorageDirectory (). GetAbsolutePath () дает другой путь – Android Android-приложение, основанное на одиночной активности, нескольких фрагментах Пример входа в Android с использованием метода POST с использованием REST API Ширина списка результатов поиска Как отправить объект JSON через Request с Android? Android Как избавиться от вопросительного знака в конце эллипсиса Поведение popBackStack () отличается после обновления библиотеки поддержки с 23.1.1 до 25.1.0 HTML5 видео – поиск кадров на устройствах Android? TypeError «Не удается установить соединение свойств # <Navigator>» в консоли при обновлении проекта до последней версии Cordova 4.0.0 Запустить средство просмотра намерений для отображения изображения с URL-адреса Как проверить язык устройства в Android? Сжатие изображения для Android без полной загрузки в память Android OpenCV Улучшение качества обнаружения Android – как передать данные в Runnable в runOnUiThread?

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

Когда countries_array как

 <resources> <string-array name="countries_array"> <item>Bahrain</item> <item>Bangladesh</item> <item>India</item> </string-array> </resources> 

Solutions Collecting From Web of "Как получить 2D-массив из XML-ресурса для Android?"

Элемент <string-array> файла ресурсов может использоваться только для одноразмерных массивов. Другими словами, все между <item> и </item> считается одной строкой.

Если вы хотите хранить данные так, как вы описываете (эффективно псевдо XML), вам нужно получить элементы как одну String[] используя getStringArray(...) и проанализировать элементы <name> и <codes> сам.

Лично я мог бы пойти с ограниченным форматом, например …

 <item>Bahrain,12345</item> 

… тогда просто используйте split(...) .

В качестве альтернативы, определите каждый <item> как объект JSONObject, такой как …

 <item>{"name":"Bahrain","code":"12345"}</item> 

Вместо многозначных записей я написал о другом подходе, в котором вы можете хранить сложные объекты в виде массива, а затем суффикс имени с помощью инкрементного целого. Прокрутите их и создайте список строго типизированных объектов оттуда, если необходимо.

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