662 Stimmen

Ist es möglich, in strings.xml Platzhalter für Laufzeitwerte zu haben?

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

0 Stimmen

1 Stimmen

@HarishGyanani Nein, dieser ist älter, er sollte stattdessen mit diesem zusammengelegt werden

1267voto

Formatierung und Stilisierung

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

Grundlegende Verwendung

Beachten Sie, dass getString hat eine Überladung, die die Zeichenfolge als Formatzeichenfolge verwendet:

String text = res.getString(R.string.welcome_messages, username, mailCount);

Plurale

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.

72 Stimmen

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...)

17 Stimmen

Für Plurals in String.xml müssen Sie id als R.plurals.welcome_messages anstelle von R.string.welcome_messages angeben

0 Stimmen

Plural Sache Rückgabe nur letzte Element Zeichenfolge ... jede Idee, wie kann anhängen Zeichenfolge erhalten.

428voto

Suragch Punkte 420096

Ergänzende Antwort

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

Beispiel

Wir werden die folgende formatierte Zeichenfolge erstellen, wobei die grauen Teile programmatisch eingefügt werden.

Meine Schwester Mary es 12 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);

Notas

  • Ich könnte Folgendes gebrauchen 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.
  • El 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.
  • Sie können einen Formatbezeichner verwenden wie %1$s mehrfach in der xml-Datei, wenn Sie sie wiederholen wollen.
  • Utilisez %% um die aktuelle % Charakter.
  • Für weitere Details lesen Sie bitte die folgende Anleitung: Android SDK-Kurztipp: Formatierung von Ressourcenstrings

0 Stimmen

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))

1 Stimmen

@programmerdreamer, Sorry, es ist schon eine Weile her, dass ich daran gearbeitet habe, und wenn ich also jemals wusste, was die $ war, habe ich jetzt vergessen.

140voto

Oded Breiner Punkte 26754

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.

0 Stimmen

Das ist eine gute Antwort, es sei denn, Sie haben einen Parameter in <![CDATA[ &param; ]]>

2 Stimmen

Gibt es eine Möglichkeit, die <!DOCTYPE... ]> Teil in einer separaten Datei speichern und in mehrere Ressourcendateien einfügen? Gibt es einen Trick, um dies zu erreichen?

22voto

user3016503 Punkte 211

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 :)

5 Stimmen

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?

0 Stimmen

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.

0 Stimmen

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/

9voto

CoolMind Punkte 21914

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.com

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.

Powered by:

X