String dynamique utilisant String.xml?
est-il possible d'avoir des placeholders dans les valeurs de chaîne de caractères dans string.xml qui peuvent être attribuées des valeurs au moment de l'exécution?
exemple:
une chaîne de caractères PLACEHOLDER1 certains plus de corde
9 réponses
formatage et stylisation
Oui, voir la suite de Chaîne de Ressources: mise en forme et Style
si vous avez besoin de formater vos chaînes de caractères en utilisant
String.format(String, Object...), alors vous pouvez le faire en mettant vos arguments format dans la ressource string. Par exemple, avec la ressource suivante:<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>dans cet exemple, la chaîne de format a deux arguments:
%1$sest une chaîne et%2$dest un nombre décimal. Vous pouvez formater la chaîne avec les arguments de votre application comme ceci:Resources res = getResources(); String text = String.format(res.getString(R.string.welcome_messages), username, mailCount);
Usage De Base
notez que getString a une surcharge qui utilise la chaîne comme chaîne de format:
String text = res.getString(R.string.welcome_messages, username, mailCount);
Pluriels
si vous devez manipuler des pluriels, utilisez ceci:
<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>
le premier mailCount param est utilisé pour décider quel format à utiliser (simple ou pluriel), les autres params sont vos substitutions:
Resources res = getResources();
String text = res.getQuantityString(R.plurals.welcome_messages, mailCount, username, mailCount);
Voir Chaîne de Ressources: les Pluriels pour plus de détails.
Réponse Supplémentaire
lorsque j'ai vu pour la première fois %1$s et %2$d dans la réponse acceptée, cela n'avait aucun sens. Voici un peu plus d'explications.
ils sont appelés spécificateurs de format. Dans la chaîne xml ils sont sous la forme de
%[parameter_index$][format_type]
- % : le signe pour cent marque le début du spécificateur de format.
- paramètre indice : il s'agit d'un nombre suivi d'un signe dollar. Si vous aviez trois paramètres que vous vouliez insérer dans la chaîne, alors ils seraient appelés
1$,2$, et3$. L'ordre vous les placez dans la chaîne de ressource n'a pas d'importance, seul l'ordre que vous fournissez les paramètres. -
format type : Il ya un lot de façons que vous pouvez formater les choses ( voir la documentation ). Voici quelques exemples:
-
schaîne -
ddécimal integer -
fnombre à virgule
-
exemple
nous allons créer la chaîne formatée suivante où les parties grises sont insérées programmatiquement.
Ma sœur
Maryest12ans.
de la chaîne.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);
Notes
- je pouvais utiliser
getStringparce que j'étais dans une activité. Vous pouvez utilisercontext.getResources().getString(...)s'il n'est pas disponible. -
String.format()formatera aussi chaîne. - les Termes
1$et2$n'ont pas besoin d'être utilisés dans cet ordre. C'est-à-dire,2$peut venir avant1$. Ceci est utile lors de l'internationalisation d'une application pour des langues qui utilisent un ordre de mots différent. - Vous pouvez utiliser un spécificateur de format comme
%1$splusieurs fois dans le fichier xml si vous voulez répéter. - utilisez
%%pour obtenir le caractère%réel. - pour plus de détails, lire le tutoriel utile suivant: conseil rapide SDK Android: formatage des chaînes de ressources
quand vous voulez utiliser un paramètre des chaînes actuelles.fichier xml sans utiliser de code 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>
cela ne fonctionne pas entre les fichiers de ressources, c'est-à-dire que les variables doivent être copiées dans chaque fichier XML qui en a besoin.
était à la recherche de la même et a finalement trouvé la solution suivante très simple. Mieux: il fonctionne hors de la boîte.
1. modifier votre chaîne de 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. utiliser la substitution de chaîne de caractères:
c.getString(R.string.welcome_messages,name,count);
où c est le contexte, nom est une variable chaîne de caractères et count votre variable int
vous aurez besoin de inclure
<resources xmlns:xliff="http://schemas.android.com/apk/res-auto">
dans votre res/strings.XML. Fonctionne pour moi. :)
cependant, vous devriez également lire Elias Mårtenson 'S réponse sur Android plurals traitement de "zéro" . Il y a un problème avec l'interprétation de certaines valeurs comme "zéro".
version Kotlin de la réponse acceptée...
val res = resources
val text = String.format(res.getString(R.string.welcome_messages), username, mailCount)
vous pouvez utiliser MessageFormat
<string name="customer_address">Wellcome: {0} {1}</string>
en code Java:
String text =MessageFormat(R.string.customer_address).format("Name","Family");
niveau API 1:
https://developer.android.com/reference/java/text/MessageFormat.html
dans Kotlin vous avez juste besoin de définir votre valeur de chaîne comme ceci:
<string name="song_number_and_title">"%1$d ~ %2$s"</string>
créez une vue texte sur votre mise en page:
<TextView android:id="@+id/song_number_and_title"/>
alors faites ceci dans votre code si vous utilisez 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))
vous pourriez avoir besoin d'obtenir vos ressources à partir du contexte de l'application.
dans res/values/chaîne.xml
<resources>
<string name="app_name">Hello World</string>
<string name="my_application">Application name: %s, package name: %s</string>
</resources>
en 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);