web-dev-qa-db-fra.com

chaîne dynamique utilisant String.xml?

Est-il possible d'avoir des espaces réservés dans les valeurs de chaîne dans string.xml qui peuvent être affectées à des valeurs au moment de l'exécution?

Exemple:

une chaîne PLACEHOLDER1 une autre chaîne

424
SoftReference

Mise en forme et style

Oui, consultez les éléments suivants à partir de Ressources de chaîne: formatage et style

Si vous devez formater vos chaînes avec String.format(String, Object...), vous pouvez le faire en plaçant vos arguments de format dans la ressource chaîne. 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);

Utilisation de base

Notez que getString a une surcharge qui utilise la chaîne en tant que chaîne de format:

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

Les pluriels

Si vous devez gérer les 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 paramètre mailCount est utilisé pour décider quel format utiliser (simple ou pluriel), les autres paramètres sont vos substitutions:

Resources res = getResources();
String text = res.getQuantityString(R.plurals.welcome_messages, mailCount, username, mailCount);

Voir Ressources de chaîne: Pluraux pour plus de détails.

Réponse supplémentaire

Quand 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'explication.

Ils sont appelés spécificateurs de format. Dans la chaîne xml, ils se présentent sous la forme:

%[parameter_index$][format_type] 
  • % : le signe de pourcentage marque le début du spécificateur de format.
  • index de paramètre : il s'agit d'un nombre suivi d'un signe dollar. Si vous vouliez insérer trois paramètres dans la chaîne, ils s'appelleraient alors 1$, 2$ et 3$. L'ordre dans lequel vous les placez dans la chaîne de ressource n'a pas d'importance, seul l'ordre dans lequel vous fournissez les paramètres.
  • type de format : Il y a un lot ​​de façons de formater les choses ( voir la documentation ) Voici quelques-uns des plus communs:

    • s chaîne
    • d entier décimal
    • f nombre en virgule flottante

Exemple

Nous allons créer la chaîne formatée suivante dans laquelle les parties grises sont insérées par programme.

Ma soeur Mary a 12 ans.

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

Remarques

  • 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 également une chaîne.
  • Les termes 1$ et 2$ n'ont pas besoin d'être utilisés dans cet ordre. C'est-à-dire que 2$ peut précéder 1$. Ceci est utile lors de l'internationalisation d'une application pour les langues qui utilisent un ordre Word différent.
  • Vous pouvez utiliser un spécificateur de format tel que %1$s plusieurs fois dans le XML si vous souhaitez le répéter.
  • tilisez %% pour obtenir le caractère % actuel.
  • Pour plus de détails, lisez le didacticiel utile suivant: Conseil rapide pour le SDK Android: Mise en forme des chaînes de ressources
218
Suragch

Lorsque vous souhaitez utiliser un paramètre du fichier strings.xml actuel 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.

116
Oded Breiner

Cherchait la même chose et a finalement trouvé la solution très simple suivante. Le mieux: cela fonctionne hors de la boîte.
1. modifiez votre ressource de chaîne:

<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. utilisez la substitution de chaîne:

c.getString(R.string.welcome_messages,name,count);

où c est le contexte, nom est une variable chaîne et compte votre variable int

Vous aurez besoin d'inclure

<resources xmlns:xliff="http://schemas.Android.com/apk/res-auto">

dans votre res/strings.xml. Travaille pour moi. :)

16
user3016503

Cependant, vous devriez également lire la réponse de Elias Mårtenson sur traitement du pluriel Android à "zéro" . Il y a un problème avec l'interprétation de certaines valeurs telles que "zéro".

2
JJD

Dans Kotlin, il vous suffit de définir la valeur de votre chaîne comme suit:

<string name="song_number_and_title">"%1$d ~ %2$s"</string>

Créez une vue de texte sur votre mise en page:

<TextView Android:id="@+id/song_number_and_title"/>

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 devrez peut-être extraire vos ressources du contexte de l'application.

1
msbodw001

dans res/values ​​/ string.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);
1
Chanh

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

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

Vous pouvez utiliser MessageFormat

<string name="customer_address">Wellcome: {0} {1}</string>

En Java code:

String text =MessageFormat(R.string.customer_address).format("Name","Family");

API niveau 1:

https://developer.Android.com/reference/Java/text/MessageFormat.html

0
Ahmad Aghazadeh