Ist es möglich, Platzhalter in String-Werten zu haben in string.xml
die zur Laufzeit mit Werten belegt werden können?
Ejemplo:
einige Zeichenfolge PLATZHALTER1 etwas mehr String
Ist es möglich, Platzhalter in String-Werten zu haben in string.xml
die zur Laufzeit mit Werten belegt werden können?
Ejemplo:
einige Zeichenfolge PLATZHALTER1 etwas mehr String
Ja, siehe das Folgende von String-Ressourcen: Formatierung und Stilisierung
Wenn Sie Ihre Zeichenketten mit
String.format(String, Object...)
dann können Sie dies tun, indem Sie Ihre Formatierungsargumente in die String-Ressource einfügen. Zum Beispiel mit der folgenden Ressource:<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>
In diesem Beispiel hat die Formatzeichenfolge zwei Argumente:
%1$s
ist eine Zeichenkette und%2$d
ist eine Dezimalzahl. Sie können die Zeichenfolge mit Argumenten aus Ihrer Anwendung wie folgt formatieren:Resources res = getResources(); String text = String.format(res.getString(R.string.welcome_messages), username, mailCount);
Beachten Sie, dass getString
hat eine Überladung, die die Zeichenfolge als Formatzeichenfolge verwendet:
String text = res.getString(R.string.welcome_messages, username, mailCount);
Wenn Sie Pluralformen behandeln müssen, verwenden Sie dies:
<plurals name="welcome_messages">
<item quantity="one">Hello, %1$s! You have a new message.</item>
<item quantity="other">Hello, %1$s! You have %2$d new messages.</item>
</plurals>
Die erste mailCount
Parameter wird verwendet, um zu entscheiden, welches Format zu verwenden ist (einfach oder plural), die anderen Parameter sind Ihre Ersetzungen:
Resources res = getResources();
String text = res.getQuantityString(R.plurals.welcome_messages, mailCount, username, mailCount);
Ver String-Ressourcen: Plurale für weitere Einzelheiten.
Der Aufruf String.format im ersten Codebeispiel ist eigentlich nicht notwendig, Resources.getString() unterstützt die Formatierung, siehe: [developer.Android.com/reference/Android/content/res/](http://developer.android.com/reference/android/content/res/Resources.html#getString(int) , java.lang.Object...)
Für Plurals in String.xml müssen Sie id als R.plurals.welcome_messages anstelle von R.string.welcome_messages angeben
Plural Sache Rückgabe nur letzte Element Zeichenfolge ... jede Idee, wie kann anhängen Zeichenfolge erhalten.
Als ich das erste Mal sah %1$s
y %2$d
in der akzeptierten Antwort, das machte keinen Sinn. Hier ist eine etwas ausführlichere Erklärung.
Sie werden Formatbezeichner genannt. In der Xml-Zeichenkette haben sie die Form
%[parameter_index$][format_type]
% : Das Prozentzeichen markiert den Anfang des Formatbezeichners.
Parameter-Index : Dies ist eine Zahl, gefolgt von einem Dollarzeichen. Hätten Sie drei Parameter, die Sie in die Zeichenkette einfügen wollen, dann würden sie heißen 1$
, 2$
y 3$
. Die Reihenfolge, in der Sie sie in der Ressourcenzeichenfolge platzieren, spielt keine Rolle, nur die Reihenfolge, in der Sie die Parameter angeben.
Formattyp : Es gibt eine Los von Möglichkeiten, wie Sie Dinge formatieren können ( siehe die Dokumentation ). Hier sind einige gängige Beispiele:
s
String
d
dezimale Ganzzahl
f
Gleitkommazahl
Wir werden die folgende formatierte Zeichenfolge erstellen, wobei die grauen Teile programmatisch eingefügt werden.
Meine Schwester
Mary
es12
Jahre alt.
string.xml
<string name="my_xml_string">My sister %1$s is %2$d years old.</string>
MyActivity.java
String myString = "Mary";
int myInt = 12;
String formatted = getString(R.string.my_xml_string, myString, myInt);
getString
weil ich an einer Aktivität teilgenommen habe. Sie können verwenden context.getResources().getString(...)
wenn sie nicht verfügbar ist.String.format()
formatiert ebenfalls einen String.1$
y 2$
Die Begriffe müssen nicht in dieser Reihenfolge verwendet werden. Das heißt, 2$
kann kommen vor 1$
. Dies ist nützlich bei der Internationalisierung einer App für Sprachen, die eine andere Wortfolge verwenden.%1$s
mehrfach in der xml-Datei, wenn Sie sie wiederholen wollen.%%
um die aktuelle %
Charakter.
Wissen Sie, welchen Zweck das Dollarzeichen dort hat? Mir ist aufgefallen, dass meine App manchmal auch ohne es funktioniert. Beispiel: in strings.xml: <string name="symptoms_append">%1s Symptome</string> in meiner Aktivität: setToolbarTitle(getString(R.string.symptoms_append, it))
Wenn Sie einen Parameter aus der aktuellen Datei strings.xml verwenden möchten, ohne Java-Code zu verwenden:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE resources [
<!ENTITY appname "WhereDat">
<!ENTITY author "Oded">
]>
<resources>
<string name="app_name">&appname;</string>
<string name="description">The &appname; app was created by &author;</string>
</resources>
Dies funktioniert nicht über Ressourcendateien hinweg, d.h. die Variablen müssen in jede XML-Datei kopiert werden, die sie benötigt.
Ich habe nach demselben Problem gesucht und schließlich die folgende, sehr einfache Lösung gefunden. Und das Beste: Es funktioniert sofort nach dem Auspacken.
1. Ändern Sie Ihre String-Ressource:
<string name="welcome_messages">Hello, <xliff:g name="name">%s</xliff:g>! You have
<xliff:g name="count">%d</xliff:g> new messages.</string>
2. Verwenden Sie die Stringsubstitution:
c.getString(R.string.welcome_messages,name,count);
wobei c der Kontext ist, Name ist eine String-Variable und zählen Ihre int-Variable
Sie müssen folgende Angaben machen
<resources xmlns:xliff="http://schemas.android.com/apk/res-auto">
in Ihrer res/strings.xml. Funktioniert bei mir :)
Was ist der Sinn der xliff
Tags um die Formatbezeichner herum? Welchen zusätzlichen Nutzen bringen sie im Vergleich zur Verwendung der %s
y %d
Spezifizierer auf eigene Faust?
Das Attribut "name" im xliff-Tag dient lediglich dazu, dem Übersetzer einen Hinweis darauf zu geben, was dort ersetzt werden soll. Manchmal ist es nicht einfach zu erraten, was das "%s" bedeutet.
Das "xliff:g" wird verwendet, um Übersetzer über Abschnitte zu informieren, die nicht ersetzt werden sollen. Denken Sie dabei an Namen, Gutscheincodes und natürlich dynamische Platzhalter wie oben. Mehr Informationen hier developer.Android.com/guide/topics/resources/
Wenn Sie Prozent (%) schreiben wollen, duplizieren Sie es:
<string name="percent">%1$d%%</string>
label.text = getString(R.string.percent, 75) // Output: 75%.
Wenn Sie einfach schreiben %1$d%
erhalten Sie die Fehlermeldung: Format string 'percent' is not a valid format string so it should not be passed to String.format
.
Oder verwenden. formatted=false"
stattdessen.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
0 Stimmen
Mögliches Duplikat von Eine Zeichenfolge aus einer anderen Zeichenfolge in strings.xml referenzieren?
1 Stimmen
@HarishGyanani Nein, dieser ist älter, er sollte stattdessen mit diesem zusammengelegt werden