Ссылка на строку в ресурсе строкового массива с помощью xml - PullRequest
241 голосов
/ 12 ноября 2010

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

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

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

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

Ответы [ 5 ]

315 голосов
/ 12 ноября 2010

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

Если вы загляните в ресурс 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 ", и все же вы не потеряете способность используйте определение массива для любых целей, которые вы намеревались в первую очередь.

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

203 голосов
/ 12 ноября 2010

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

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

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

62 голосов
/ 19 июля 2015

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

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

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

9 голосов
/ 12 ноября 2010

К сожалению:

  • Кажется, вы не можете ссылаться на один элемент из массива в 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 голосов
/ 28 июля 2017

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

...