web-dev-qa-db-fra.com

Référencer une chaîne dans une ressource de tableau de chaînes avec xml

J'ai des préférences où vous pouvez activer/désactiver les éléments qui apparaîtront dans le menu. Il y a 17 éléments. J'ai créé un tableau de chaînes dans values ​​/ arrays.xml avec des titres pour chacun de ces 17 éléments.

J'ai preferences.xml qui a la mise en page de mon fichier de préférences et je voudrais faire référence à un seul élément du tableau de chaînes à utiliser comme titre.

Comment puis-je faire ceci?

Dans la référence développeur Android, je vois comment je peux référencer une seule chaîne avec XML, mais pas comment je peux référencer une chaîne à partir d'une ressource de tableau en XML.

231
Jorsher

En bref: Je ne pense pas que vous puissiez le faire, mais il semble y avoir une solution de contournement:.

Si vous regardez la ressource Android ici:

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

Vous voyez que sous la section array (string array, au moins), la "référence de ressource" (telle que vous la récupérez à partir d'un fichier XML) ne spécifie aucun moyen de traiter les éléments individuels. Vous pouvez même essayer dans votre XML d’utiliser "@ array/yourarrayhere". Je sais qu’au moment de la conception, vous obtiendrez le premier élément. Mais cela n’a aucune utilité pratique si vous voulez utiliser, disons ... le second, bien sûr.

CEPENDANT, il y a une astuce que vous pouvez faire. Vois ici:

Référencement d'une chaîne XML dans un tableau XML (Android)

Vous pouvez "tricher" (pas vraiment) la définition du tableau en adressant des chaînes indépendantes DANS la définition du tableau. Par exemple, dans votre fichier 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>

En utilisant cela, vous pouvez utiliser "@ string/earth" et "@ string/moon" normalement dans vos champs XML "Android: text" et "Android: title", sans perdre la possibilité d'utiliser le tableau. définition à toutes les fins que vous aviez l'intention en premier lieu.

Semble travailler ici sur mon Eclipse. Pourquoi n'essayez-vous pas de nous dire si cela fonctionne? :-)

309
davidcesarino

Peut-être que cela aiderait:

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

Donc, vous obtenez la liste de tableaux sous forme de chaîne [] puis choisissez n'importe quel i, some_array [i].

199
user485498

Malheureusement:

  • Il semble que vous ne pouvez pas référencer un seul élément d'un tableau dans values ​​/ arrays.xml avec XML. Bien sûr, vous pouvez le faire en Java, mais pas en XML. Il n'y a aucune information à ce sujet dans la référence développeur Android, et je n'ai pu en trouver nulle part ailleurs.

  • Il semble que vous ne pouvez pas utiliser un tableau comme clé dans la disposition des préférences. Chaque clé doit être une valeur unique avec son propre nom de clé.

Ce que je veux accomplir: Je veux pouvoir parcourir les 17 préférences, vérifier si l’élément est coché et, si tel est le cas, charger la chaîne du tableau de chaînes pour ce nom de préférence.

Voici le code que j'espérais compléter cette tâche:

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]);  
    }  
} 

Ce que j'ai fait:

  • J'ai défini une seule chaîne pour chacun des éléments, et référencé les chaînes simples dans le fichier. J'utilise la référence à une seule chaîne pour les titres de case à cocher de présentation des préférences et le tableau pour ma boucle.

  • Pour parcourir les préférences, je viens de nommer les clés key1, key2, key3, etc. Puisque vous référencez une clé avec une chaîne, vous avez la possibilité de "construire" le nom de la clé au moment de l'exécution.

Voici le nouveau code:

for (int i = 0; i < 16; i++) {  
        if (prefs.getBoolean("itemKey" + String.valueOf(i), true)) {  
        itemsArrayList.add(itemNames[i]);  
    }  
}
9
Jorsher

Une autre façon de le faire est de définir un tableau de ressources dans strings.xml comme ci-dessous.

<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE resources [
    <!ENTITY supportDefaultSelection "Choose your issue">
    <!ENTITY issueOption1 "Support">
    <!ENTITY issueOption2 "Feedback">
    <!ENTITY issueOption3 "Help">
    ]>

puis en définissant un tableau de chaînes en utilisant les ressources ci-dessus

<string-array name="support_issues_array">
        <item>&supportDefaultSelection;</item>
        <item>&issueOption1;</item>
        <item>&issueOption2;</item>
        <item>&issueOption3;</item>
    </string-array>

Vous pouvez également faire référence à la même chaîne dans d'autres xml tout en conservant DRY intact ... L'avantage que je vois est que, avec un seul changement de valeur, toutes les références du code seraient affectées.

0
Amruta-Pani