Verweisen auf eine Zeichenfolge in einer Zeichenfolgenarray-Ressource mit XML

256

Ich habe Einstellungen, in denen Sie aktivieren / deaktivieren können, welche Elemente im Menü angezeigt werden. Es gibt 17 Artikel. Ich habe in values ​​/ arrays.xml ein String-Array mit Titeln für jedes dieser 17 Elemente erstellt.

Ich habe die Datei settings.xml, die das Layout für meine Einstellungsdatei enthält, und ich möchte auf ein einzelnes Element aus dem Zeichenfolgenarray verweisen, das als Titel verwendet werden soll.

Wie kann ich das machen?

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

Jorsher
quelle

Antworten:

331

Kurz gesagt: Ich glaube nicht, dass Sie das können, aber es scheint eine Problemumgehung zu geben : .

Wenn Sie sich die Android-Ressource hier ansehen:

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

Sie sehen als unter dem Array-Abschnitt (mindestens String-Array), dass die "RESOURCE REFERENCE" (wie Sie aus einem XML erhalten) keine Möglichkeit angibt, die einzelnen Elemente zu adressieren. Sie können sogar in Ihrem XML versuchen, "@ array / yourarrayhere" zu verwenden. Ich weiß, dass Sie in der Entwurfszeit den ersten Artikel erhalten. Aber das nützt nichts, wenn Sie es verwenden möchten, sagen wir ... das zweite natürlich.

Es gibt jedoch einen Trick, den Sie tun können. Siehe hier:

Referenzieren einer XML-Zeichenfolge in einem XML-Array (Android)

Sie können die Array-Definition (nicht wirklich) "betrügen", indem Sie unabhängige Zeichenfolgen IN der Definition des Arrays adressieren. Zum Beispiel in Ihrer Datei 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>

Auf diese Weise können Sie "@ string / earth" und "@ string / moon" normalerweise in Ihren XML-Feldern "android: text" und "android: title" verwenden, ohne die Fähigkeit zu verlieren, das Array zu verwenden Definition für jeden Zweck, den Sie ursprünglich beabsichtigt haben.

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

davidcsb
quelle
32
Wenn wir nur name<item> s Tags geben könnten ... * seufz *
Einige Noob-Studenten
2
Hab es einfach versucht! Definierte das Array in der Standardeinstellung strings.xml, aber nicht in values-frund das Array wurde immer noch mit der französischen Version aktualisiert. Also falsch .. aber cool es funktioniert!
Blundell
1
Schneller Tipp an alle: Durch Doppelklicken auf "Erde" wird die Erde hervorgehoben. Durch Doppelklicken auf den Mond in @ string / moon wird nur der Mond hervorgehoben. Wenn Sie also beim Erstellen Ihres Arrays das erste Element mehrmals duplizieren, können Sie es ganz einfach kopieren und zwischen Ihren einzelnen Zeichenfolgen und dem Zeichenfolgenarray einfügen. Könnte helfen, die Erstellung Ihres String-Arrays zu beschleunigen :)
ArtOfWarfare
2
Möchten Sie nur wissen, ob dieser Ansatz zu einer schlechteren Leistung führt, als wenn ich Zeichenfolgen im Array so deklariere, wie sie sind, aber keine Referenzen verwenden?
Alex Bonel
1
@AlexBonel eine interessante Frage, und ich weiß es ehrlich gesagt nicht. Selbst wenn dies der Fall wäre, sollten wir diese Art der Mikrooptimierung dem Compiler überlassen. Wie auch immer, enden sie nicht irgendwo auf der Straße? Ich würde vermuten, dass sie es tun, aber ich bin mir nicht sicher. Zumindest auf einer höheren Ebene in der Android-Kette weiß ich, dass Sie eine APK mit apktool vollständig zerlegen können und die ursprünglichen Namen der Zeichenfolgenschlüssel wiederherstellen, was bedeutet, dass deklarierte Deklarationen wie die oben genannten beibehalten werden. Aber ich interessiere mich momentan nicht sehr für diesen Bereich, daher kann ich Ihre Frage nicht beantworten. Das ist aber eine gute Frage.
Davidcsb
216

Vielleicht würde das helfen:

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

Sie erhalten also die Array-Liste als String [] und wählen dann ein beliebiges i, some_array [i].


quelle
10
Ich verstehe, wie man die Array-Ressource erhält. Dadurch kann ich das Element aus dem Array jedoch nicht in einem XML-Layout referenzieren.
Jorsher
1
Oh, tut mir leid. Ich habe es falsch verstanden. Nun, muss es im XML-Layout sein? Wenn sich der Titel mit der Auswahl des Benutzers ändert, können Sie dies einfach in der Java-Datei tun. ZB .setText (some_array [i]).
2
Weil das Einstellungslayout in XML ist. Java lädt das Menü mit den Elementen, die in den Einstellungen "aktiviert" sind. Das Eingeben von 17 Überprüfungen nach Einstellungen und der nachfolgende Code zum Hinzufügen zur Listenansicht erscheint mir einfach überflüssig und schlampig.
Jorsher
Dies war nützlich, als ich einen Arrayadapter aus einem XML-Array in meinem Werteordner erstellte
EHarpham
Ich fand dies nützlich, wenn ich einen Standardwert benötigte, um eine Voreinstellung zu erhalten: String myPref = preferences.getString(context.getResources().getString(R.string.my_pref), some_array [0]);wobei my_pref zuvor auf einen Wert festgelegt war some_array [x]
Al Lelopath
67

Die bessere Option wäre, einfach das zurückgegebene Ressourcenarray als Array zu verwenden, was bedeutet:

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

Dies ist ein Shortcut-Ansatz der oben genannten Ansätze, erledigt die Arbeit jedoch in der von Ihnen gewünschten Weise. Andernfalls bietet Android keine direkte XML-Indizierung für XML-basierte Arrays.

Amitesh
quelle
1
@ Benjiko99 danke für das Erkennen des Fehlers, habe ihn entsprechend geändert.
Amitesh
Dies ist der prägnanteste Weg, dies zu tun. +1!
Suomi35
1
Dies mag prägnanter erscheinen, aber wenn jemand oder der Übersetzer die Reihenfolge des Arrays in der Zeichenfolgendatei ändert, wird am Ende die falsche Zeichenfolge verwendet.
NewDeveloper
9

Unglücklicherweise:

  • Es scheint, dass Sie nicht ein einzelnes Element aus einem Array in values ​​/ arrays.xml mit XML referenzieren können. Natürlich können Sie 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 einem eigenen Schlüsselnamen sein.

Was ich erreichen möchte: Ich möchte in der Lage sein, die 17 Einstellungen zu durchlaufen, zu überprüfen, ob das Element aktiviert ist, und, falls dies der Fall ist, die Zeichenfolge aus dem Zeichenfolgenarray für diesen Voreinstellungsnamen zu laden.

Hier ist der Code, von dem ich gehofft hatte, dass er diese Aufgabe erfüllen würde:

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 getan habe:

  • Ich habe für jedes Element eine einzelne Zeichenfolge festgelegt und auf die einzelnen Zeichenfolgen in der verwiesen. Ich verwende die Referenz für eine einzelne Zeichenfolge für die Titel der Kontrollkästchen für das Layout der Einstellungen und das Array für meine Schleife.

  • Um die Einstellungen zu durchlaufen, habe ich nur die Schlüssel wie Schlüssel1, Schlüssel2, Schlüssel3 usw. benannt. Da Sie einen Schlüssel mit einer Zeichenfolge referenzieren, haben Sie die Möglichkeit, den Schlüsselnamen zur Laufzeit zu "erstellen".

Hier ist der neue Code:

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

Eine andere Möglichkeit besteht darin, ein Ressourcenarray in der Datei strings.xml wie unten definiert zu definieren.

<?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-Arrays unter Verwendung der oben genannten Ressourcen

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

Sie können dieselbe Zeichenfolge auch in andere XML-Dateien verweisen, wobei DRY intakt bleibt. Der Vorteil, den ich sehe, ist, dass mit einer einzigen Wertänderung alle Referenzen im Code beeinflusst werden.

Amruta-Pani
quelle