Referenzieren einer Zeichenfolge in einer Zeichenfolgenarray-Ressource mit XML

Ich habe Vorlieben, 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.

Ich habe preferences.xml, das das Layout für meine Einstellungsdatei hat, 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 von einer Array-Ressource in XML referenzieren kann.

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

Wenn Sie hier einen Blick in die Android Resource casting:

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

Sie sehen, als unter der Array-Abschnitt (mindestens String-Array), die “RESOURCE REFERENCE” (wie Sie von einem XML erhalten) keine Möglichkeit, 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 du machen kannst. Siehe hier:

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

Sie können die Array-Definition “betrügen” (nicht wirklich), indem Sie innerhalb der Definition des Arrays unabhängige Strings adressieren. Zum Beispiel in Ihrer strings.xml:

Earth Moon  @string/earth @string/moon  

Wenn Sie dies verwenden, können Sie normalerweise “@ string / earth” und “@ string / moon” in Ihren XML-Feldern “android: text” und “android: title” verwenden und Sie verlieren trotzdem nicht die Fähigkeit, das Array zu verwenden Definition für welche Zwecke auch immer Sie beabsichtigten.

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

Vielleicht würde das helfen:

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

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

Die bessere Option wäre, das Array resource resource einfach als Array zu verwenden, was bedeutet:

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

Dies ist eine Abkürzung der oben genannten Ansätze, aber die Arbeit in der von Ihnen gewünschten Weise. Andernfalls bietet Android keine direkte XML-Indizierung für XML-basierte Arrays.

Unglücklicherweise:

  • Es scheint, dass Sie nicht ein einzelnes Element aus einem Array in values ​​/ arrays.xml mit XML referenzieren 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 Layout der Einstellungen verwenden können. Jeder Schlüssel muss ein einzelner Wert mit seinem 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 wenn dies der Fall ist, laden Sie die Zeichenfolge aus dem Zeichenfolgenarray für diesen Präferenznamen.

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

 SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); ArrayAdapter itemsArrayList = new ArrayAdapter(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 Datei verwiesen. 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 einfach 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 zu "bauen".

Hier ist der neue Code:

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

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 issueOption1 "Support"> < !ENTITY issueOption2 "Feedback"> < !ENTITY issueOption3 "Help"> ]> 

und dann Definieren eines String-Arrays unter Verwendung der obigen Ressourcen

  &supportDefaultSelection; &issueOption1; &issueOption2; &issueOption3;  

Sie könnten die gleiche Zeichenfolge auch in andere xmls übertragen, um DRY intakt zu halten. Der Vorteil, den ich sehe, ist, dass sich bei einer einzigen Änderung alle Referenzen im Code ändern würden.