Ссылка на строку в ресурсе массива строк с помощью xml
У меня есть настройки, в которых вы можете включить/отключить, какие элементы будут отображаться в меню. Есть 17 предметов. Я создал массив строк в значениях /arrays.xml с заголовками для каждого из этих 17 элементов.
У меня есть preferences.xml, который имеет макет для моего файла предпочтений, и я хотел бы ссылаться на один элемент из массива строк, который будет использоваться в качестве заголовка.
Как я могу это сделать?
В ссылке разработчика Android я вижу, как я могу ссылаться на одну строку с XML, но не на то, как я могу ссылаться на строку из ресурса массива в XML.
Ответы
Ответ 1
Короче: Я не думаю, что вы можете, но, похоже, это обходное решение:.
Если вы посмотрите на Android-ресурс здесь:
http://developer.android.com/guide/topics/resources/string-resource.html
Вы видите, что в разделе массива (по крайней мере, в массиве строк) "РЕСУРС РЕСУРС" (как вы получаете из 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", и все же вы не потеряете способность используйте определение массива для любых целей, которые вы намеревались в первую очередь.
Кажется, здесь работает на моем Eclipse. Почему бы вам не попробовать и не сказать нам, работает ли это?: -)
Ответ 2
Возможно, это помогло бы:
String[] some_array = getResources().getStringArray(R.array.your_string_array)
Итак, вы получаете массив-список как String [], а затем выбираете любой i, some_array [i].
Ответ 3
Лучшим вариантом было бы просто использовать массив возвращаемых ресурсов как массив,
Значение:
getResources().getStringArray(R.array.your_array)[position]
Это яркий подход к вышеупомянутым подходам, но делает работу по вашему желанию. В противном случае андроид не обеспечивает прямое индексирование XML для массивов на основе xml.
Ответ 4
К сожалению:
-
Кажется, вы не можете ссылаться на один элемент из массива в values /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]);
}
}
Ответ 5
Другой способ сделать это - определить массив ресурсов в файле 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 без изменений.
Преимущество, которое я вижу, заключается в том, что с одним изменением значения он будет влиять на все ссылки в коде.