wake-up-neo.net

Verweis auf einen String in einer String-Array-Ressource mit XML

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

Ich habe preferences.xml, das das Layout für meine Voreinstellungsdatei hat, und ich möchte auf ein einzelnes Element aus dem String-Array verweisen, das als Titel verwendet werden soll.

Wie kann ich das machen?

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

231
Jorsher

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

Wenn Sie hier einen Blick in die Android-Ressource werfen:

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

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

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

Verweis auf einen XML-String in einem XML-Array (Android)

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

Wenn Sie dies verwenden, können Sie normalerweise "@ string/earth" und "@ string/moon" in Ihren XML-Feldern "Android: text" und "Android: title" verwenden, ohne dass Sie jedoch die Möglichkeit verlieren, das Array zu verwenden Definition für alle Zwecke, die Sie ursprünglich beabsichtigt haben.

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

309
davidcesarino

Vielleicht würde das helfen:

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

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

199
user485498

Die bessere Option wäre, einfach das von der Ressource zurückgegebene Array als Array zu verwenden.

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

Dies ist eine Abkürzung für die oben genannten Vorgehensweisen, die jedoch in der von Ihnen gewünschten Weise funktionieren. Andernfalls bietet Android keine direkte XML-Indizierung für xml-basierte Arrays.

62
Amitesh

Unglücklicherweise:

  • Es scheint, dass Sie mit XML nicht in XML/value/arrays.xml auf ein einzelnes Element aus einem Array verweisen können. Natürlich können Sie Java, aber nicht XML. Es gibt keine Informationen dazu in der Android-Entwicklerreferenz, und ich könnte nirgendwo sonst etwas 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 markiert ist, und falls vorhanden, den String aus dem String-Array für diesen Namen der Einstellung zu laden.

Hier ist der Code, von dem ich hoffte, dass er diese Aufgabe abschließen 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 der Elemente eine einzelne Zeichenfolge festgelegt und auf die einzelnen Zeichenfolgen in der verwiesen. Ich verwende die Referenz für die einzelne Zeichenfolge für die Kontrollkästchen-Titel des Voreinstellungslayouts 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 einer Zeichenfolge 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]);  
    }  
}
9
Jorsher

Eine andere Möglichkeit besteht darin, ein Ressourcenarray in strings.xml wie folgt 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 ein String-Array mit den oben genannten Ressourcen definieren

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

Sie könnten dieselbe Zeichenfolge auch in andere XML-Dateien einbeziehen, wobei DRY intakt bleibt ..__ Der Vorteil, den ich sehe, ist, dass bei einer einzigen Wertänderung alle Verweise im Code betroffen wären.

0
Amruta-Pani