Est-il possible d'avoir des espaces réservés dans des valeurs de chaîne dans string.xml
lesquelles des valeurs peuvent être affectées au moment de l'exécution?
Exemple:
de la chaîne PLACEHOLDER1 de la chaîne
android
string
string-formatting
android-resources
SoftReference
la source
la source
Réponses:
Formatage et style
Oui, voir ce qui suit dans String Resources: Formating and Styling
Utilisation de base
Notez qu'il y
getString
a une surcharge qui utilise la chaîne comme chaîne de format:Pluriels
Si vous devez gérer des pluriels, utilisez ceci:
Le premier
mailCount
paramètre est utilisé pour décider du format à utiliser (simple ou pluriel), les autres paramètres sont vos substitutions:Voir String Resources: Plurals pour plus de détails.
la source
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 de
1$
,2$
et3$
. L'ordre dans lequel vous les placez dans la chaîne de ressources n'a pas d'importance, seul l'ordre dans lequel vous fournissez les paramètres.type de format : Il existe de nombreuses façons de formater des éléments ( voir la documentation ). Voici quelques exemples courants:
s
chaîned
entier décimalf
nombre à virgule flottanteExemple
Nous allons créer la chaîne formatée suivante où les parties grises sont insérées par programme.
string.xml
MyActivity.java
Remarques
getString
parce que j'étais dans une activité. Vous pouvez l'utilisercontext.getResources().getString(...)
s'il n'est pas disponible.String.format()
formatera également une chaîne.1$
et2$
n'ont pas besoin d'être utilisés dans cet ordre. Autrement dit,2$
peut venir avant1$
. Cela est utile lors de l'internationalisation d'une application pour les langues qui utilisent un ordre de mots différent.%1$s
plusieurs fois dans le xml si vous souhaitez le répéter.%%
pour obtenir le réel%
personnage .la source
Lorsque vous souhaitez utiliser un paramètre du fichier strings.xml réel sans utiliser de code Java:
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.
la source
<!DOCTYPE... ]>
pièce dans un fichier séparé et de l'inclure dans plusieurs fichiers de ressources? Une astuce pour y parvenir?Cherchait la même chose et a finalement trouvé la solution très simple suivante. Meilleur: cela fonctionne hors de la boîte.
1. modifiez votre ressource de chaîne:
2. utilisez la substitution de chaîne:
c.getString(R.string.welcome_messages,name,count);
où c est le contexte, le nom est une variable chaîne et comptez votre variable int
Vous devrez inclure
dans votre res / strings.xml. Travaille pour moi. :)
la source
xliff
servent les balises autour des spécificateurs de format? Quelle valeur ajoutée ajoutent-ils au lieu d'utiliser uniquement les spécificateurs%s
et%d
?Dans Kotlin, il vous suffit de définir la valeur de votre chaîne comme ceci:
Créez une vue texte sur votre mise en page:
Ensuite, faites cela dans votre code si vous utilisez Anko:
Vous devrez peut-être obtenir vos ressources à partir du contexte de l'application.
la source
Cependant, vous devriez également lire la réponse d' Elias Mårtenson sur le traitement des pluriels Android de «zéro» . Il y a un problème avec l'interprétation de certaines valeurs telles que "zéro".
la source
dans res / values / string.xml
en code java
la source
Vous pouvez utiliser
MessageFormat
:En code Java:
API niveau 1:
https://developer.android.com/reference/java/text/MessageFormat.html
la source
Si vous voulez écrire le pourcentage (%), dupliquez-le:
Si vous écrivez simplement
%1$d%
, vous obtiendrez l'erreur:Format string 'percent' is not a valid format string so it should not be passed to String.format
.la source
Oui! vous pouvez le faire sans écrire de code Java / Kotlin, uniquement XML en utilisant cette petite bibliothèque que j'ai créée, qui le fait au moment de la construction, de sorte que votre application ne sera pas affectée par celle-ci: https://github.com/LikeTheSalad/android -string-reference
Usage
Vos cordes:
La chaîne générée après la construction:
la source
Une solution directe de Kotlin au problème:
strings.xml
kotlinActivityORFragmentFile.kt:
la source
Dans votre fichier de chaîne, utilisez ceci
Et dans votre code, utilisez en conséquence
la source
Version Kotlin de la réponse acceptée ...
la source
resources.getString(int, ... args)
méthode avec des arguments au lieu deString.format
. Il n'y a pas non plus de spécificité kotlin dans ce code, autre queval
mot clé. Voir la réponse de msbodw001