Ist es möglich, Platzhalter in Zeichenfolgenwerten in string.xml
Zu haben, denen zur Laufzeit Werte zugewiesen werden können?
Beispiel:
eine Zeichenfolge PLACEHOLDER1 eine weitere Zeichenfolge
Ja, siehe das Folgende von String-Ressourcen: Formatieren und Stylen
Wenn Sie Ihre Zeichenfolgen mit
String.format(String, Object...)
formatieren müssen, können Sie dies tun, indem Sie Ihre Formatierungsargumente in die Zeichenfolgenressource 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 ein String und%2$d
ist eine Dezimalzahl. Sie können die Zeichenfolge folgendermaßen mit Argumenten aus Ihrer Anwendung formatieren:Resources res = getResources(); String text = String.format(res.getString(R.string.welcome_messages), username, mailCount);
Beachten Sie, dass getString
eine Überladung aufweist, die die Zeichenfolge als Formatzeichenfolge verwendet:
String text = res.getString(R.string.welcome_messages, username, mailCount);
Wenn Sie mit Pluralformen umgehen müssen, verwenden Sie Folgendes:
<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>
Der erste mailCount
Parameter wird verwendet, um zu entscheiden, welches Format verwendet werden soll (einzeln oder im Plural). Die anderen Parameter sind Ihre Substitutionen:
Resources res = getResources();
String text = res.getQuantityString(R.plurals.welcome_messages, mailCount, username, mailCount);
Weitere Informationen finden Sie unter String Resources: Plurals .
Als ich zum ersten Mal %1$s
Und %2$d
In der akzeptierten Antwort sah, ergab das keinen Sinn. Hier noch eine Erklärung.
Sie werden Formatbezeichner genannt. In der XML-Zeichenfolge haben sie die Form
%[parameter_index$][format_type]
1$
, 2$
Und 3$
Heißen. Die Reihenfolge, in der Sie sie in die Ressourcenzeichenfolge einfügen, spielt keine Rolle, nur die Reihenfolge, in der Sie die Parameter angeben.Formattyp : Es gibt eine Menge Möglichkeit, Dinge zu formatieren ( siehe Dokumentation ). Hier sind einige gebräuchliche:
s
Zeichenfolged
Dezimalzahlf
GleitkommazahlWir werden die folgende formatierte Zeichenfolge erstellen, in die die grauen Teile programmgesteuert eingefügt werden.
Meine Schwester
Mary
ist12
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
verwenden, weil ich in einer Aktivität war. Sie können context.getResources().getString(...)
verwenden, wenn es nicht verfügbar ist.String.format()
formatiert auch einen String.1$
Und 2$
Müssen nicht in dieser Reihenfolge verwendet werden. Das heißt, 2$
Kann vor 1$
Stehen. Dies ist nützlich, wenn Sie eine App für Sprachen internationalisieren, die eine andere Word-Reihenfolge verwenden.%1$s
Mehrmals in der XML verwenden, wenn Sie ihn wiederholen möchten.%%
, Um das aktuelle Zeichen %
Abzurufen.Wenn Sie einen Parameter aus der aktuellen Datei strings.xml verwenden möchten, ohne einen Code Java) 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. Variablen müssen in jede XML-Datei kopiert werden, die sie benötigt.
War auf der Suche nach der gleichen und fand schließlich die folgende sehr einfache Lösung. Das Beste: es funktioniert sofort.
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 Zeichenfolgensubstitution:
c.getString(R.string.welcome_messages,name,count);
dabei ist c der Kontext, Name eine Zeichenfolgenvariable und Anzahl Ihre int-Variable
Sie müssen einschließen
<resources xmlns:xliff="http://schemas.Android.com/apk/res-auto">
in deiner res/strings.xml. Funktioniert bei mir. :)
Sie sollten jedoch auch die Antwort von Elias Mårtenson auf Behandlung von „Null“ durch Android-Plural lesen. Es gibt ein Problem bei der Interpretation bestimmter Werte wie "Null".
In Kotlin müssen Sie nur Ihren Zeichenfolgenwert wie folgt festlegen:
<string name="song_number_and_title">"%1$d ~ %2$s"</string>
Erstellen Sie eine Textansicht in Ihrem Layout:
<TextView Android:id="@+id/song_number_and_title"/>
Führen Sie dies in Ihrem Code aus, wenn Sie Anko verwenden:
val song = database.use { // get your song from the database }
song_number_and_title.setText(resources.getString(R.string.song_number_and_title, song.number, song.title))
Möglicherweise müssen Sie Ihre Ressourcen aus dem Anwendungskontext abrufen.
in res/values / string.xml
<resources>
<string name="app_name">Hello World</string>
<string name="my_application">Application name: %s, package name: %s</string>
</resources>
in Java code
String[] args = new String[2];
args[0] = context.getString(R.string.app_name);
args[1] = context.getPackageName();
String textMessage = context.getString(R.string.my_application,(Object[]) args);
Kotlin-Version der akzeptierten Antwort ...
val res = resources
val text = String.format(res.getString(R.string.welcome_messages), username, mailCount)
Sie können MessageFormat
verwenden
<string name="customer_address">Wellcome: {0} {1}</string>
In Java Code:
String text =MessageFormat(R.string.customer_address).format("Name","Family");
API Level 1:
https://developer.Android.com/reference/Java/text/MessageFormat.html