2010-11-12 7 views
200

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 articles. J'ai créé un tableau de chaînes dans values ​​/ arrays.xml avec des titres pour chacun de ces 17 éléments. J'ai des préférences.xml qui a la disposition pour mon fichier de préférences, et je voudrais référencer un seul élément du tableau de chaînes à utiliser comme titre.Référencer une chaîne dans une ressource tableau de chaînes avec xml

Comment est-ce que je peux faire ceci?

Dans la référence de 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 d'une ressource de tableau en XML.

Répondre

284

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

Si vous jetez un coup d'oeil dans la ressource Android ici:

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

Vous voyez que dans la section de tableau (tableau de chaîne, au moins), la « REFERENCE DES RESSOURCES » (comme vous obtenez d'un XML) ne spécifie pas un moyen d'adresser les éléments individuels. Vous pouvez même essayer dans votre XML d'utiliser "@ array/yourarrayhere". Je sais que dans le temps de conception, vous obtiendrez le premier article. Mais cela n'a aucune utilité pratique si vous voulez utiliser, disons ... la seconde, bien sûr. Cependant, il y a une astuce que vous pouvez faire. Voir ici:

Referencing an XML string in an XML Array (Android)

Vous pouvez « tricher » (pas vraiment) la définition de tableau en adressant des chaînes indépendantes dans la définition du tableau. Par exemple, dans votre 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/terre" et "string @/lune" normalement dans votre "android: texte" et "android: le titre" Champs XML, et pourtant vous ne perdrez pas la possibilité d'utiliser la définition de tableau à des fins que vous vouliez en premier lieu.

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

+0

Merci, c'est ce que j'ai fait;) J'étais en train de taper ma réponse quand vous avez posté la vôtre. Merci! – Jorsher

+0

Pouvez-vous accepter la réponse en cliquant sur la coche verte? :-P – davidcesarino

+0

Et en passant, je vous en prie. Je pense aussi que Android devrait avoir un moyen d'adresser un tableau en XML sans avoir recours à cette solution de contournement détaillée.Quelque chose comme "@ array/yourarray (1)" Mais au moins cela fonctionne. – davidcesarino

175

Peut-être que cela aiderait:

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

Ainsi, vous obtenez la liste de tableau en tant que chaîne [] puis tout i, some_array [i].

+5

Je comprends comment obtenir la ressource de tableau. Cela ne me permet pas de référencer l'élément du tableau dans une mise en page XML. – Jorsher

+1

Ah, désolé. J'ai mal compris. Eh bien, doit-il être dans la mise en page xml? Si le titre change avec le choix de l'utilisateur, pourquoi ne pas le faire dans le fichier .java. Par exemple. .setText (un_array [i]). –

+1

Parce que, la disposition des préférences est en XML. Le java charge le menu avec les éléments qui sont "activés" dans les préférences. Taper jusqu'à 17 contrôles pour les préférences, et le code suivant pour l'ajouter à la liste apparaît juste redondant et bâclé pour moi. – Jorsher

7

Malheureusement:

  • Il semble que vous ne pouvez pas faire référence à un seul élément d'un tableau en valeurs/arrays.xml avec XML. Bien sûr, vous pouvez en Java, mais pas XML. Il n'y a aucune information sur cela dans la référence du développeur Android, et je ne pouvais pas trouver nulle part ailleurs.

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

Ce que je veux accomplir: Je veux être en mesure de boucle à travers les 17 préférences, vérifiez si l'option est cochée, et si elle est, charger la chaîne à partir du tableau de chaînes pour ce nom de préférence.

Voici le code que j'espérais compléterait 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 je l'ai fait:

  • Je mis une seule chaîne pour chacun des éléments, et référencent cordes simples en la . J'utilise la référence de chaîne unique pour les titres de la case à cocher de mise en page des préférences, et le tableau pour ma boucle. Pour faire défiler les préférences, je viens de nommer les clés comme key1, key2, key3, etc. Comme 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]); 
    } 
} 
44

La meilleure option serait de simplement utiliser le tableau des ressources retourné comme un tableau, sens:

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

C'est un approche de raccourci des approches mentionnées ci-dessus, mais fait le travail de la manière que vous voulez. Sinon, Android ne fournit pas d'indexation XML directe pour les tableaux basés sur xml.

+0

je voudrais juste souligner que c'est getResources() – Benjiko99

+1

@ Benjiko99 merci de repérer l'erreur, l'ont changé en conséquence. – Amitesh

+0

C'est la manière la plus concise de le faire. +1! – suomi35

0

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 définir 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 consulter la même chaîne dans d'autres xmls trop garder au sec intact. L'avantage que je vois est, avec un seul changement de valeur, il affecterait toutes les références dans le code.

Questions connexes