it-swarm.com.ru

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

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

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

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

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

231
Jorsher

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

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

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

309
davidcesarino

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

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

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

199
user485498

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

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

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

60
Amitesh

К несчастью:

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

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

0
Amruta-Pani