wake-up-neo.com

dynamischer String mit String.xml?

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

424
SoftReference

Formatieren und Stylen

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

Grundsätzliche Verwendung

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

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

Pluralformen

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 .

Ergänzende Antwort

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] 
  • % : Das Prozentzeichen markiert den Anfang des Formatbezeichners.
  • Parameterindex : Dies ist eine Zahl, gefolgt von einem Dollarzeichen. Wenn Sie drei Parameter hätten, die Sie in die Zeichenfolge einfügen möchten, würden sie 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 Zeichenfolge
    • d Dezimalzahl
    • f Gleitkommazahl

Beispiel

Wir werden die folgende formatierte Zeichenfolge erstellen, in die die grauen Teile programmgesteuert eingefügt werden.

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

Anmerkungen

  • Ich könnte 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.
  • Die Begriffe 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.
  • Sie können einen Formatbezeichner wie %1$s Mehrmals in der XML verwenden, wenn Sie ihn wiederholen möchten.
  • Verwenden Sie %%, Um das aktuelle Zeichen % Abzurufen.
  • Weitere Informationen finden Sie in der folgenden hilfreichen Anleitung: Android SDK-Kurztipp: Formatieren von Ressourcenzeichenfolgen
218
Suragch

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.

116
Oded Breiner

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

16
user3016503

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

2
JJD

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.

1
msbodw001

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

Kotlin-Version der akzeptierten Antwort ...

val res = resources
val text = String.format(res.getString(R.string.welcome_messages), username, mailCount)
0
jesses.co.tt

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

0
Ahmad Aghazadeh