Ist es möglich, Platzhalter in Zeichenfolgenwerten zu haben string.xml
, denen zur Laufzeit Werte zugewiesen werden können?
Beispiel:
einige Zeichenfolge PLACEHOLDER1 einige weitere Zeichenfolge
android
string
string-formatting
android-resources
SoftReference
quelle
quelle
Antworten:
Formatierung und Styling
Ja, siehe Folgendes unter Zeichenfolgenressourcen: Formatieren und Stylen
Grundlegende Verwendung
Beachten Sie, dass
getString
es eine Überladung gibt, die die Zeichenfolge als Formatzeichenfolge verwendet:Pluralformen
Wenn Sie mit Pluralformen umgehen müssen, verwenden Sie Folgendes:
Der erste
mailCount
Parameter wird verwendet, um zu entscheiden, welches Format verwendet werden soll (Einzel- oder Plural). Die anderen Parameter sind Ihre Ersetzungen:Siehe String - Ressourcen: Plurale für weitere Details.
quelle
Ergänzende Antwort
Als ich das erste Mal sah
%1$s
und%2$d
in der akzeptierten Antwort, machte es keinen Sinn. Hier ist eine weitere Erklärung.Sie werden als Formatbezeichner bezeichnet. In der XML-Zeichenfolge haben sie die Form
1$
,2$
und3$
. 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 viele Möglichkeiten, wie Sie Dinge formatieren können ( siehe Dokumentation ). Hier sind einige gebräuchliche:
s
Zeichenfolged
Dezimalzahlf
GleitkommazahlBeispiel
Wir werden die folgende formatierte Zeichenfolge erstellen, in die die grauen Teile programmgesteuert eingefügt werden.
string.xml
MyActivity.java
Anmerkungen
getString
weil ich in einer Aktivität war. Sie können verwenden,context.getResources().getString(...)
wenn es nicht verfügbar ist.String.format()
formatiert auch einen String.1$
und2$
müssen nicht in dieser Reihenfolge verwendet werden. Das heißt,2$
kann vorher kommen1$
. Dies ist nützlich, wenn Sie eine App für Sprachen internationalisieren, die eine andere Wortreihenfolge verwenden.%1$s
mehrmals in der XML verwenden, wenn Sie ihn wiederholen möchten.%%
, um den tatsächlichen%
Charakter zu erhalten.quelle
Wenn Sie einen Parameter aus der eigentlichen Datei strings.xml verwenden möchten, ohne Java-Code zu verwenden:
Dies funktioniert nicht über Ressourcendateien hinweg, dh Variablen müssen in jede XML-Datei kopiert werden, die sie benötigt.
quelle
<!DOCTYPE... ]>
Teil in einer separaten Datei zu definieren und in mehrere Ressourcendateien aufzunehmen? Irgendein Trick, um dies zu erreichen?War auf der Suche nach dem gleichen und fand schließlich die folgende sehr einfache Lösung. Das Beste: Es funktioniert sofort.
1. Ändern Sie Ihre String-Ressource:
2. Verwenden Sie die Zeichenfolgenersetzung:
c.getString(R.string.welcome_messages,name,count);
Dabei ist c der Kontext, name eine Zeichenfolgenvariable und zählt Ihre int-Variable
Sie müssen einschließen
in Ihrer res / strings.xml. Funktioniert bei mir. :) :)
quelle
xliff
Tags um die Formatspezifizierer? Welchen zusätzlichen Wert bieten sie im Gegensatz zur alleinigen Verwendung der%s
und%d
-Spezifizierer?In Kotlin müssen Sie Ihren String-Wert nur so einstellen:
Erstellen Sie eine Textansicht in Ihrem Layout:
Dann tun Sie dies in Ihrem Code, wenn Sie Anko verwenden:
Möglicherweise müssen Sie Ihre Ressourcen aus dem Anwendungskontext abrufen.
quelle
Sie sollten jedoch auch die Antwort von Elias Mårtenson auf die Android-Pluralbehandlung von „Null“ lesen . Es gibt ein Problem bei der Interpretation bestimmter Werte wie "Null".
quelle
in res / values / string.xml
in Java-Code
quelle
Sie können verwenden
MessageFormat
:Im Java-Code:
API-Ebene 1:
https://developer.android.com/reference/java/text/MessageFormat.html
quelle
Wenn Sie Prozent (%) schreiben möchten, duplizieren Sie es:
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
.quelle
Ja! Sie können dies tun, ohne Java / Kotlin-Code zu schreiben, sondern nur XML, indem Sie diese kleine Bibliothek verwenden, die ich erstellt habe. Dies geschieht zur Erstellungszeit, sodass Ihre App davon nicht betroffen ist: https://github.com/LikeTheSalad/android -string-Referenz
Verwendungszweck
Deine Saiten:
Die generierte Zeichenfolge nach dem Erstellen:
quelle
Eine direkte Kotlin-Lösung für das Problem:
string.xml
kotlinActivityORFragmentFile.kt:
quelle
Verwenden Sie dies in Ihrer String-Datei
Und in Ihrem Code entsprechend verwenden
quelle
Kotlin-Version der akzeptierten Antwort ...
quelle
resources.getString(int, ... args)
Methode mit Argumenten anstelle vonString.format
. Dieser Code enthält auch keine Kotlin-Details, außer demval
Schlüsselwort. Siehe Antwort von msbodw001