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



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



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



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



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

561   5  

5 ответов:

короче: Я не думаю, что вы можете, но там, кажется, ошибка:.

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

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

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

однако, есть трюк, который вы можете сделать. Смотрите здесь:

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

вы можете "обмануть" (не совсем) определение массива, обратившись к независимым строкам внутри определения массива. Например, в вашем веревка.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)

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

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

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

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

к сожалению:

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

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

Comments

    Ничего не найдено.