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

355
demandé sur Rahul Tiwari 2010-09-07 10:55:03

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$s est une chaîne et %2$d est 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.

794
répondu Megha Joshi - GoogleTV DevRel 2018-05-18 03:46:04

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$ , et 3$ . 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:

    • s chaîne
    • d décimal integer
    • f nombre à virgule

exemple

nous allons créer la chaîne formatée suivante où les parties grises sont insérées programmatiquement.

Ma sœur Mary est 12 ans.

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 getString parce que j'étais dans une activité. Vous pouvez utiliser context.getResources().getString(...) s'il n'est pas disponible.
  • String.format() formatera aussi chaîne.
  • les Termes 1$ et 2$ n'ont pas besoin d'être utilisés dans cet ordre. C'est-à-dire, 2$ peut venir avant 1$ . 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$s plusieurs 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
167
répondu Suragch 2018-09-11 04:30:33

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.

107
répondu WhereDatApp.com 2017-06-22 15:58:05

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

15
répondu user3016503 2015-06-05 13:16:46

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

2
répondu JJD 2017-05-23 12:34:45

version Kotlin de la réponse acceptée...

val res = resources
val text = String.format(res.getString(R.string.welcome_messages), username, mailCount)
0
répondu jesses.co.tt 2017-08-21 06:03:37

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

0
répondu Ahmad Aghazadeh 2017-10-02 18:16:19

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.

0
répondu msbodw001 2017-10-10 19:17:58

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);
0
répondu Chanh 2018-07-17 08:12:37