Je voudrais référencer une chaîne d'une autre chaîne dans mon fichier strings.xml, comme ci-dessous (notez spécifiquement la fin du contenu de la chaîne "message_text"):
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="button_text">Add item</string>
<string name="message_text">You don't have any items yet! Add one by pressing the \'@string/button_text\' button.</string>
</resources>
J'ai essayé la syntaxe ci-dessus mais le texte imprime le "@ string / button_text" en texte clair. Pas ce que je veux. Je voudrais que le texte du message s'imprime "Vous n'avez pas encore d'articles! Ajoutez-en un en appuyant sur le bouton" Ajouter un article "."
Existe-t-il un moyen connu d'atteindre ce que je veux?
JUSTIFICATION:
Mon application a une liste d'éléments, mais lorsque cette liste est vide, j'affiche à la place une TextView "@android: id / empty". Le texte de ce TextView est destiné à informer l'utilisateur sur la façon d'ajouter un nouvel élément. Je voudrais rendre ma mise en page infaillible aux changements (oui, je suis le fou en question :-)
Réponses:
Une bonne façon d'insérer une chaîne fréquemment utilisée (par exemple le nom de l'application) dans xml sans utiliser de code Java: source
METTRE À JOUR:
Vous pouvez même définir votre entité globalement, par exemple:
res / raw / entity.ent:
res / values / string.xml:
la source
Il est possible de référencer l'un dans l'autre tant que votre chaîne entière est constituée du nom de référence. Par exemple, cela fonctionnera:
Il est encore plus utile pour définir des valeurs par défaut:
Maintenant, vous pouvez utiliser
string_default
partout dans votre code et vous pouvez facilement changer la valeur par défaut à tout moment.la source
Je pense que tu ne peux pas. Mais vous pouvez "formater" une chaîne comme vous le souhaitez:
Dans le code:
la source
String text = res.getString(R.string.message_text, res.getString(R.string.button_text));
est un peu plus propre.Dans Android, vous ne pouvez pas concaténer des chaînes dans XML
Ce qui suit n'est pas pris en charge
Consultez ce lien ci-dessous pour savoir comment y parvenir
Comment concaténer plusieurs chaînes en XML Android?
la source
J'ai créé un plugin Gradle simple qui vous permet de référencer une chaîne d'une autre. Vous pouvez référencer des chaînes qui sont définies dans un autre fichier, par exemple dans une variante de construction ou une bibliothèque différente. Inconvénients de cette approche - Refactor IDE ne trouvera pas de telles références.
Utilisez la
{{string_name}}
syntaxe pour référencer une chaîne:Pour intégrer le plugin, ajoutez simplement le code suivant dans votre
build.gradle
fichier de niveau module d'application ou de bibliothèqueMISE À JOUR: La bibliothèque ne fonctionne pas avec le plug-in Android Gradle version 3.0 et supérieure, car la nouvelle version du plug-in utilise aapt2 qui regroupe les ressources au format binaire .flat, de sorte que les ressources compressées ne sont pas disponibles pour la bibliothèque. En tant que solution temporaire, vous pouvez désactiver aapt2 en définissant android.enableAapt2 = false dans votre fichier gradle.properties.
la source
> Could not get unknown property 'referencedString'
Vous pouvez utiliser votre propre logique, qui résout récursivement les chaînes imbriquées.
D'un
Activity
, par exemple, appelez-le comme çala source
Je suis conscient que c'est un article plus ancien, mais je voulais partager la solution rapide et sale que j'ai trouvée pour un de mes projets. Il ne fonctionne que pour TextViews mais pourrait également être adapté à d'autres widgets. Notez qu'il nécessite que le lien soit placé entre crochets (par exemple
[@string/foo]
).L'inconvénient de cette approche est qu'elle
setText()
convertit leCharSequence
en unString
, ce qui est un problème si vous passez des choses comme unSpannableString
; pour mon projet, ce n'était pas un problème car je ne l'ai utilisé que pourTextViews
cela, je n'avais pas besoin d'y accéder depuis monActivity
.la source
Avec la nouvelle liaison de données, vous pouvez concaténer et faire beaucoup plus dans votre xml.
par exemple, si vous avez reçu message1 et message2, vous pouvez:
vous pouvez même importer des utilitaires de texte et appeler String.format et vos amis.
malheureusement, si vous voulez le réutiliser à plusieurs endroits, il peut devenir désordonné, vous ne voulez pas ce morceau de code partout. et vous ne pouvez pas les définir en xml en un seul endroit (pas que je sache) donc pour cela, vous pouvez créer une classe qui encapsulera ces compositions:
alors vous pouvez l'utiliser à la place (vous devrez importer la classe avec la liaison de données)
la source
En plus de la réponse ci-dessus de Francesco Laurita https://stackoverflow.com/a/39870268/9400836
Il semble qu'il y ait une erreur de compilation "& entity; a été référencé, mais non déclaré" qui peut être résolu en référençant la déclaration externe comme ceci
res / raw / entity.ent
res / values / strings.xml
Bien qu'il compile et s'exécute, il a une valeur vide. Peut-être que quelqu'un sait comment résoudre ce problème. J'aurais posté un commentaire mais la réputation minimum est de 50.
la source
Vous pouvez utiliser des espaces réservés de chaîne (% s) et les remplacer à l'aide de java au moment de l'exécution
et en java
puis placez-le à l'endroit où il utilise la chaîne
la source
%1$s
,%2$s
etc. au lieu de%s
.J'ai créé une petite bibliothèque qui vous permet de résoudre ces espaces réservés au moment de la construction, vous n'aurez donc pas à ajouter de code Java / Kotlin pour obtenir ce que vous voulez.
Sur la base de votre exemple, vous devez configurer vos chaînes comme ceci:
Et puis le plugin se chargera de générer ce qui suit:
Cela fonctionne également pour les chaînes localisées et de saveur, les chaînes générées se tiendront également à jour chaque fois que vous apportez des modifications à vos modèles ou à ses valeurs.
Plus d'informations ici: https://github.com/LikeTheSalad/android-string-reference
la source