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

257

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 référencer un seul élément du tableau de chaînes à utiliser comme titre.

Comment puis-je faire ceci?

Dans la référence du 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.

Jorsher
la source

Réponses:

332

En bref: Je ne pense pas que vous pouvez, mais il semble être une solution de contournement: .

Si vous jetez un œil à la ressource Android ici:

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

Vous voyez que sous la section tableau (tableau de chaînes, au moins), la "RÉFÉRENCE DES RESSOURCES" (comme vous l'obtenez à partir d'un XML) ne spécifie pas une façon 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 article. Mais cela n'a aucune utilité pratique si vous voulez utiliser, disons ... le second, bien sûr.

TOUTEFOIS, 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 À L'INTÉRIEUR de 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 l'utilisant, vous pouvez utiliser "@ string / earth" et "@ string / moon" normalement dans vos champs XML "android: text" et "android: title", et pourtant vous ne perdrez pas la possibilité d'utiliser le tableau définition pour toutes les fins que vous vouliez en premier lieu.

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

davidcsb
la source
32
si nous pouvions seulement donner des namebalises aux <item> s ... * soupir *
Un étudiant de Noob
2
Je viens de l'essayer! Défini le tableau par défaut strings.xmlmais ne l'a pas fait values-fret le tableau est toujours mis à jour avec la version française. Tellement mal .. mais cool ça marche!
Blundell
1
Astuce rapide pour tout le monde: Double-cliquez sur "terre" pour mettre en évidence la terre. Double-cliquer sur la lune dans @ string / moon mettra en surbrillance juste la lune. Ainsi, si vous dupliquez le premier élément plusieurs fois lors de la création de votre tableau, vous pouvez ensuite copier et coller entre vos chaînes individuelles et le tableau de chaînes assez facilement. Pourrait aider à accélérer la création de votre tableau de chaînes :)
ArtOfWarfare
2
Je veux juste savoir si cette approche entraîne des performances moins bonnes que si je déclare les chaînes dans le tableau telles quelles mais sans utiliser de références?
Alex Bonel
1
@AlexBonel une question intéressante, et honnêtement, je ne sais pas. Même si c'était le cas, je pense que nous devrions laisser ce type de très micro optimisation au compilateur. Quoi qu'il en soit, ne finissent-ils pas en ligne quelque part sur la route? Je suppose que oui, mais je n'en suis pas sûr. Au moins à un niveau supérieur dans la chaîne Android, je sais que vous pouvez entièrement démonter un APK avec apktool, et il récupérera les noms originaux des clés de chaîne, ce qui signifie que les déclarations référencées, comme celle ci-dessus, sont conservées. Mais je ne suis pas très intéressé par ce domaine en ce moment, donc je ne peux pas répondre à votre question. C'est une bonne question cependant.
davidcsb
217

Peut-être que cela aiderait:

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

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


la source
10
Je comprends comment obtenir la ressource du tableau. Cela ne me permet pas de référencer l'élément du tableau dans une disposition xml.
Jorsher
1
Ah désolé. J'ai mal compris. Eh bien, doit-il être dans la disposition xml? Si le titre change avec le choix de l'utilisateur, pourquoi ne pas simplement le faire dans le fichier .java. Par exemple .setText (some_array [i]).
2
Parce que la disposition des préférences est en xml. La java charge le menu avec les éléments qui sont "activés" dans les préférences. Taper 17 vérifications des préférences, et le code suivant pour l'ajouter à la vue de liste me semble simplement redondant et bâclé.
Jorsher
Cela était utile lorsque je créais un arrayadapter à partir d'un tableau xml dans mon dossier de valeurs
EHarpham
J'ai trouvé cela utile lorsque j'avais besoin d'une valeur par défaut lors de l'obtention d'une préférence: String myPref = preferences.getString(context.getResources().getString(R.string.my_pref), some_array [0]);où my_pref était précédemment défini sur une certaine valeur some_array [x]
Al Lelopath
67

La meilleure option serait d'utiliser simplement le tableau renvoyé par la ressource comme un tableau, ce qui signifie:

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

Il s'agit d'une approche de raccourci des approches mentionnées ci-dessus, mais elle fonctionne comme vous le souhaitez. Sinon, Android ne fournit pas d'indexation XML directe pour les tableaux basés sur XML.

Amitesh
la source
1
@ Benjiko99 merci d'avoir repéré l'erreur, l'ont modifiée en conséquence.
Amitesh
C'est la manière la plus concise de le faire. +1!
suomi35
1
cela peut sembler plus concis mais si quelqu'un ou le traducteur change l'ordre du tableau dans le fichier de chaînes, vous finirez par utiliser la mauvaise chaîne.
newDeveloper
9

Malheureusement:

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

  • Il semble que vous ne puissiez 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 c'est le cas, charger la chaîne à partir du tableau de chaînes pour ce nom de préférence.

Voici le code que j'espérais accomplir 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 chaîne unique pour chacun des éléments et référencé les chaînes uniques dans le. J'utilise la référence de chaîne unique pour les titres des cases de mise en page des préférences et le tableau pour ma boucle.

  • Pour parcourir les préférences, je viens de nommer les clés comme 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]);  
    }  
}
Jorsher
la source
1

Une autre façon de le faire consiste à 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 également référencer la même chaîne dans d'autres fichiers XML en gardant DRY intact. L'avantage que je vois est qu'avec un seul changement de valeur, cela affecterait toutes les références dans le code.

Amruta-Pani
la source