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

228

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

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

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

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

Теги:
arrays
reference
preferences

5 ответов

289
Лучший ответ

Короче: Я не думаю, что вы можете, но, похоже, это обходное решение:.

Если вы посмотрите на 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. Почему бы вам не попробовать и не сказать нам, работает ли это?: -)

  • 0
    Спасибо, это то, что я сделал;) Я был в процессе ввода своего ответа, когда вы опубликовали свой. Спасибо!
  • 0
    Можете ли вы принять ответ, нажав на зеленую галочку? :-П
Показать ещё 14 комментариев
199

Возможно, это помогло бы:

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

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

  • 9
    Я понимаю, как получить массив ресурсов. Это не позволяет мне ссылаться на элемент из массива в формате XML.
  • 1
    Ах, прости. Я неправильно понял. Ну, это должно быть в макете XML? Если заголовок меняется в зависимости от выбора пользователя, почему бы просто не сделать это в файле .java. Например .setText (some_array [i]).
Показать ещё 3 комментария
59

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

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

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

  • 0
    Я просто хотел бы отметить, что это getResources ()
  • 1
    @ Benjiko99 спасибо за обнаружение ошибки, изменили ее соответственно.
Показать ещё 2 комментария
9

К сожалению:

  • Кажется, вы не можете ссылаться на один элемент из массива в 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]);  
    }  
}
0

Другой способ сделать это - определить массив ресурсов в файле 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 без изменений. Преимущество, которое я вижу, заключается в том, что с одним изменением значения он будет влиять на все ссылки в коде.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню