Ссылка на строку в ресурсе массива строк с помощью xml

У меня есть настройки, в которых вы можете включить / отключить, какие элементы будут отображаться в меню. Есть 17 предметов. Я создал массив строк в values ​​/ arrays.xml с заголовками для каждого из этих 17 элементов.

У меня есть preferences.xml, который имеет макет для моего файла предпочтений, и я хотел бы ссылаться на один элемент из массива строк для использования в качестве заголовка.

Как я могу это сделать?

В ссылке разработчика Android я вижу, как я могу ссылаться на одну строку с XML, но не на то, как я могу ссылаться на строку из ресурса массива в XML.

Короче: я не думаю, что вы можете, но, похоже, это обходной путь:.

Если вы посмотрите на Android-ресурс здесь:

http://developer.android.com/guide/topics/resources/string-resource.html

Вы видите, что в разделе массива (по крайней мере, в массиве строк) «RESOURCE REFERENCE» (как вы получаете из XML) не указывает способ обращения к отдельным элементам. Вы даже можете попробовать в своем XML использовать «@ array / yourarrayhere». Я знаю, что во время разработки вы получите первый предмет. Но это нецелесообразно использовать, если вы хотите использовать, скажем … второе, конечно.

ОДНАКО, есть трюк, который вы можете сделать. Глянь сюда:

Ссылка на XML-строку в массиве XML (Android)

Вы можете «обмануть» (не совсем) определение массива, обратившись к независимым строкам ВНУТРИ определения массива. Например, в вашем файле strings.xml:

<string name="earth">Earth</string> <string name="moon">Moon</string> <string-array name="system"> <item>@string/earth</item> <item>@string/moon</item> </string-array> 

Используя это, вы можете использовать «@ string / earth» и «@ string / moon», как правило, в ваших XML-файлах «android: text» и «android: title», и все же вы не потеряете возможность использовать массив Определение для любых целей, которые вы намеревались в первую очередь.

Кажется, здесь работает на моем Затмении. Почему бы вам не попробовать и не сказать нам, работает ли это? 🙂

Может быть, это поможет:

 String[] some_array = getResources().getStringArray(R.array.your_string_array) 

Таким образом, вы получаете массив-список как String [], а затем выбираете любой i, some_array [i].

Лучшим вариантом было бы просто использовать массив возвращаемых ресурсов как массив, что означает:

getResources().getStringArray(R.array.your_array)[position]

Это ярлык подхода вышеупомянутых подходов, но делает работу в моде вы хотите. В противном случае андроид не обеспечивает прямую индексацию XML для массивов на основе xml.

К сожалению:

  • Кажется, вы не можете ссылаться на один элемент из массива в значениях / arrays.xml с XML. Конечно, вы можете на Java, но не на XML. Нет никакой информации об этом в ссылке разработчика Android, и я не мог найти нигде.

  • Кажется, вы не можете использовать массив в качестве ключа в макете настроек. Каждый ключ должен быть единственным значением с его собственным ключевым именем.

То, что я хочу выполнить: я хочу, чтобы иметь возможность прокручивать 17 предпочтений, проверить, проверен ли элемент, и если это так, загрузите строку из массива строк для этого имени предпочтения.

Вот код, который я надеялся выполнить эту задачу:

 SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); ArrayAdapter<String> itemsArrayList = new ArrayAdapter<String>(getBaseContext(), android.R.layout.simple_list_item_1); String[] itemNames = getResources().getStringArray(R.array.itemNames_array); for (int i = 0; i < 16; i++) { if (prefs.getBoolean("itemKey[i]", true)) { itemsArrayList.add(itemNames[i]); } } 

Что я сделал:

  • Я устанавливаю одну строку для каждого из элементов и ссылаюсь на одиночные строки в. Я использую однострочную ссылку для заголовков макетов предпочтений и массив для моего цикла.

  • Чтобы перебрать настройки, я просто назвал такие клавиши, как key1, key2, key3 и т. Д. Поскольку вы ссылаетесь на ключ со строкой, у вас есть возможность «построить» имя ключа во время выполнения.

Вот новый код:

 for (int i = 0; i < 16; i++) { if (prefs.getBoolean("itemKey" + String.valueOf(i), true)) { itemsArrayList.add(itemNames[i]); } } 

Другой способ сделать это – определить массив ресурсов в файле strings.xml, как показано ниже.

 <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE resources [ <!ENTITY supportDefaultSelection "Choose your issue"> <!ENTITY issueOption1 "Support"> <!ENTITY issueOption2 "Feedback"> <!ENTITY issueOption3 "Help"> ]> 

А затем определение массива строк с использованием вышеуказанных ресурсов

 <string-array name="support_issues_array"> <item>&supportDefaultSelection;</item> <item>&issueOption1;</item> <item>&issueOption2;</item> <item>&issueOption3;</item> </string-array> 

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