2010-11-12 2 views
200

Ich habe Einstellungen, wo Sie aktivieren/deaktivieren können, welche Elemente im Menü angezeigt werden. Es gibt 17 Gegenstände. Ich habe ein String-Array in values ​​/ arrays.xml mit Titeln für jedes dieser 17 Elemente erstellt.Verweis auf eine Zeichenfolge in einer Zeichenfolge Array-Ressource mit XML

Ich habe preferences.xml, die das Layout für meine Einstellungsdatei hat, und ich möchte ein einzelnes Element aus dem Zeichenfolgenarray verweisen, um als den Titel zu verwenden.

Wie kann ich das tun?

In der Android-Entwicklerreferenz sehe ich, wie ich eine einzelne Zeichenfolge mit XML referenzieren kann, aber nicht, wie ich eine Zeichenfolge von einer Matrixressource in XML referenzieren kann.

Antwort

284

Kurz gesagt: Ich glaube nicht, dass Sie können, aber es scheint eine Abhilfe:.

Wenn Sie einen Blick in die Android-Ressource hier:

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

Sie sehen als unter dem Feldabschnitt (String-Array, zumindest), die „Ressource-Referenz“ (wie man es von einem bekommen XML) gibt keine Möglichkeit an, die einzelnen Elemente zu adressieren. Sie können sogar versuchen, in Ihrem XML "@ array/yourarrayhere" zu verwenden. Ich weiß, dass du in der Designzeit den ersten Gegenstand bekommst. Aber das ist praktisch nicht zu gebrauchen, wenn man, sagen wir ..., das zweite natürlich benutzen will.

JEDOCH gibt es einen Trick, den Sie tun können. Siehe hier:

Referencing an XML string in an XML Array (Android)

Sie können "betrügen" (nicht wirklich), um die Array-Definition von unabhängigen Strings INSIDE der Definition der Array-Adressierung. Zum Beispiel in Ihrem 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> 

Durch diesen verwenden, können Sie "@ Zeichenfolge/Erde" und "@ String/Mond" in der Regel in Ihrem verwenden "android: text" und "android: title" XML-Felder, und dennoch werden Sie nicht die Fähigkeit verlieren, die Array-Definition für die von Ihnen beabsichtigten Zwecke zu verwenden.

Scheint hier auf meiner Eclipse zu arbeiten. Warum versuchst du es uns nicht zu sagen, wenn es funktioniert? :-)

+0

Danke, das habe ich gemacht;) Ich war gerade dabei, meine Antwort zu tippen, als du deine gepostet hast. Vielen Dank! – Jorsher

+0

Können Sie die Antwort akzeptieren, indem Sie auf den grünen Haken klicken? :-P – davidcesarino

+0

Und übrigens, gern geschehen. Ich denke auch, dass Android eine Möglichkeit haben sollte, ein Array in XML anzusprechen, ohne auf diese ausführliche Problemumgehung zurückgreifen zu müssen.So etwas wie "@ array/yourarray (1)" Aber zumindest funktioniert es. – davidcesarino

175

Vielleicht würde dies helfen:

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

So erhalten Sie die Array-Liste als String [] und wählen Sie dann eine beliebige i, some_array [i].

+5

Ich verstehe, wie Sie die Array-Ressource erhalten. Das erlaubt mir jedoch nicht, das Element aus dem Array in einem XML-Layout zu referenzieren. – Jorsher

+1

Ah, tut mir leid. Ich habe es falsch verstanden. Nun, muss es im XML-Layout sein? Wenn sich der Titel mit der Benutzerauswahl ändert, tun Sie dies einfach in der .java-Datei. Z.B. .setText (einige_array [i]). –

+1

Da das Layout der Einstellungen in XML ist. Der Java lädt das Menü mit den Elementen, die in den Einstellungen "aktiviert" sind. Bei der Eingabe von 17 werden Präferenzen geprüft, und der nachfolgende Code, der zur Listenansicht hinzugefügt wird, erscheint mir überflüssig und schlampig. – Jorsher

7

Leider:

  • Es scheint, dass Sie nicht ein einzelnes Element aus einem Array in Werte/arrays.xml mit XML verweisen können. Natürlich kann man in Java, aber nicht in XML. Es gibt keine Informationen dazu in der Android-Entwicklerreferenz, und ich konnte nirgendwo anders finden.

  • Es scheint, dass Sie ein Array nicht als Schlüssel im Einstellungslayout verwenden können. Jeder Schlüssel muss ein einzelner Wert mit seinem eigenen Schlüsselnamen sein.

Was ich erreichen will: ich eine Schleife durch die 17 Präferenzen der Lage sein wollen, prüfen Sie, ob die Option aktiviert ist, und wenn ja, für diese Präferenz Namen die Zeichenfolge der String-Array laden.

Hier ist der Code, den ich diese Aufgabe würde vervollständigen hatte gehofft:

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

Was ich tat:

  • Ich habe eine einzelne Zeichenfolge für jedes der Elemente, und verwiesen die einzelnen Strings das . Ich verwende die Referenz für die einzelnen Zeichenfolgen für die Kontrollkästchen für die Voreinstellungen und das Array für meine Schleife.

  • Um die Einstellungen zu durchlaufen, habe ich nur die Schlüssel wie key1, key2, key3 usw. benannt. Da Sie einen Schlüssel mit einem String referenzieren, haben Sie die Möglichkeit, den Schlüsselnamen zur Laufzeit "aufzubauen".

Hier ist der neue Code:

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

Die bessere Option wäre, nur die Ressource-Array als Array zurückgegeben zu verwenden, Bedeutung:

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

Dies ist ein Shortcut-Ansatz der oben genannten Ansätze, aber die Arbeit in der Mode, die Sie wollen. Andernfalls bietet Android keine direkte XML-Indizierung für XML-basierte Arrays.

+0

ich möchte nur darauf hinweisen, dass es ist getResources() – Benjiko99

+1

@ Benjiko99 danke für das Erkennen des Fehlers, habe es entsprechend geändert. – Amitesh

+0

Dies ist der prägnanteste Weg, dies zu tun. +1! – suomi35

0

Eine andere Möglichkeit, dies zu tun, ist das Definieren eines Ressourcenarrays in strings.xml wie unten.

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

und dann Definieren eines String-Array mit den oben genannten Ressourcen

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

Sie die gleiche Zeichenfolge in andere xmls verweisen konnte DRY intakt zu halten. Der Vorteil, den ich sehe, ist, mit einer einzigen Wertänderung würde es sich auf alle Referenzen im Code auswirken.

Verwandte Themen