È possibile avere segnaposto nei valori stringa in string.xml
cui è possibile assegnare valori in fase di esecuzione?
Esempio:
qualche stringa PLACEHOLDER1 qualche altra stringa
È possibile avere segnaposto nei valori stringa in string.xml
cui è possibile assegnare valori in fase di esecuzione?
Esempio:
qualche stringa PLACEHOLDER1 qualche altra stringa
Risposte:
Sì, vedere quanto segue da Risorse stringa: Formattazione e stile
Se è necessario formattare le stringhe utilizzando
String.format(String, Object...)
, è possibile farlo inserendo gli argomenti del formato nella risorsa stringa. Ad esempio, con la seguente risorsa:<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>
In questo esempio, la stringa di formato ha due argomenti:
%1$s
è una stringa ed%2$d
è un numero decimale. Puoi formattare la stringa con argomenti della tua applicazione in questo modo:Resources res = getResources(); String text = String.format(res.getString(R.string.welcome_messages), username, mailCount);
Si noti che getString
ha un sovraccarico che utilizza la stringa come stringa di formato:
String text = res.getString(R.string.welcome_messages, username, mailCount);
Se devi gestire i plurali, usa questo:
<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>
Il primo mailCount
parametro viene utilizzato per decidere quale formato utilizzare (singolo o plurale), gli altri parametri sono le sostituzioni:
Resources res = getResources();
String text = res.getQuantityString(R.plurals.welcome_messages, mailCount, username, mailCount);
Vedi Risorse sulle stringhe: plurali per maggiori dettagli.
Quando ho visto per la prima volta %1$s
e %2$d
nella risposta accettata, non aveva senso. Ecco una spiegazione in più.
Sono chiamati identificatori di formato. Nella stringa xml sono nella forma di
%[parameter_index$][format_type]
1$
, 2$
e 3$
. L'ordine in cui vengono inseriti nella stringa di risorse non ha importanza, ma solo l'ordine in cui vengono forniti i parametri.tipo di formato : ci sono molti modi in cui puoi formattare le cose ( vedi la documentazione ). Eccone alcuni comuni:
s
cordad
numero intero decimalef
numero in virgola mobileCreeremo la seguente stringa formattata in cui le parti grigie vengono inserite a livello di codice.
Mia sorella
Mary
è12
anni.
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
perché ero in un'attività. È possibile utilizzare context.getResources().getString(...)
se non è disponibile.String.format()
formatterà anche una stringa.1$
e 2$
non devono essere usati in quell'ordine. Cioè, 2$
può venire prima 1$
. Ciò è utile quando si internazionalizza un'app per lingue che usano un diverso ordine di parole.%1$s
più volte nel file XML se si desidera ripeterlo.%%
per ottenere il %
personaggio reale .Quando si desidera utilizzare un parametro dal file strings.xml effettivo senza utilizzare alcun codice Java:
<?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>
Questo non funziona su tutti i file di risorse, ovvero le variabili devono essere copiate in ogni file XML che ne ha bisogno.
<!DOCTYPE... ]>
parte in un file separato e includerla in più file di risorse? Qualche trucco per raggiungere questo obiettivo?
Stava cercando lo stesso e finalmente ho trovato la seguente soluzione molto semplice. Migliore: funziona fuori dagli schemi.
1. modifica la tua risorsa di stringa:
<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. usa la sostituzione di stringa:
c.getString(R.string.welcome_messages,name,count);
dove c è il contesto, name è una variabile stringa e conta la variabile int
Dovrai includere
<resources xmlns:xliff="http://schemas.android.com/apk/res-auto">
nel tuo res / strings.xml. Per me va bene. :)
xliff
tag attorno agli identificatori di formato? Quale valore aggiunto aggiungono invece di usare da soli gli specificatori %s
e %d
?
In Kotlin devi solo impostare il valore della stringa in questo modo:
<string name="song_number_and_title">"%1$d ~ %2$s"</string>
Crea una vista di testo sul layout:
<TextView android:id="@+id/song_number_and_title"/>
Quindi fai questo nel tuo codice se stai usando Anko:
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))
Potrebbe essere necessario recuperare le risorse dal contesto dell'applicazione.
Tuttavia, dovresti anche leggere la risposta di Elias Mårtenson sul trattamento plurale di Android "zero" . C'è un problema con l'interpretazione di alcuni valori come "zero".
in res / valori / stringa.xml
<resources>
<string name="app_name">Hello World</string>
<string name="my_application">Application name: %s, package name: %s</string>
</resources>
nel codice java
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);
Puoi usare MessageFormat
:
<string name="customer_address">Wellcome: {0} {1}</string>
Nel codice Java:
String text = MessageFormat(R.string.customer_address).format("Name","Family");
Livello API 1:
https://developer.android.com/reference/java/text/MessageFormat.html
Se vuoi scrivere percent (%), duplicalo:
<string name="percent">%1$d%%</string>
label.text = getString(R.string.percent, 75) // Output: 75%.
Se si scrive semplicemente %1$d%
, si otterrà l'errore: Format string 'percent' is not a valid format string so it should not be passed to String.format
.
Sì! puoi farlo senza scrivere alcun codice Java / Kotlin, solo XML usando questa piccola libreria che ho creato, che lo fa in fase di compilazione, quindi la tua app non ne sarà influenzata: https://github.com/LikeTheSalad/android -String riferimento
uso
Le tue corde:
<resources>
<string name="app_name">My App Name</string>
<string name="template_welcome_message">Welcome to ${app_name}</string>
</resources>
La stringa generata dopo la creazione:
<!--resolved.xml-->
<resources>
<string name="welcome_message">Welcome to My App Name</string>
</resources>
Una soluzione Kotlin diretta al problema:
strings.xml
<string name="customer_message">Hello, %1$s!\nYou have %2$d Products in your cart.</string>
kotlinActivityORFragmentFile.kt:
val username = "Andrew"
val products = 1000
val text: String = String.format(
resources.getString(R.string.customer_message), username, products )
Nel tuo file di stringa usa questo
<string name="redeem_point"> You currently have %s points(%s points = 1 %s)</string>
E nel tuo codice usa come di conseguenza
coinsTextTV.setText(String.format(getContext().getString(R.string.redeem_point), rewardPoints.getReward_points()
, rewardPoints.getConversion_rate(), getString(R.string.rs)));
Versione di Kotlin della risposta accettata ...
val res = resources
val text = String.format(res.getString(R.string.welcome_messages), username, mailCount)
resources.getString(int, ... args)
metodo con argomenti anziché String.format
. Non ci sono neanche specifiche di kotlin in questo codice, tranne la val
parola chiave. Vedi la risposta di msbodw001