250 votes

Référencer une chaîne à partir d’une autre chaîne dans strings.xml ?

Je voudrais faire référence à une chaîne dans une autre chaîne de caractères dans mon strings.xml fichier, comme ci-dessous (particulièrement à la fin de la "message_text" chaîne de contenu):

<?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 puis imprime le texte "@string/button_text" en texte clair. Pas ce que je veux. Je voudrais que le message texte à imprimer "Vous n'avez pas d'articles encore! Ajoutez-en une en cliquant sur "Ajouter un article"."

Est-il un moyen connu de réaliser ce que je veux?

JUSTIFICATION:
Ma demande a une liste d'éléments, mais lorsque la liste est vide, je montre un "@android:id/empty" TextView à la place. Le texte de ce TextView est d'informer l'utilisateur comment ajouter un nouvel élément. Je voudrais faire de ma mise en page épreuve des changements (oui, je suis l'imbécile en question :-)

194voto

Barry Fruitman Points 3401

Il est possible de référence l’un dans l’autre, aussi longtemps que vous référencez l’ensemble de la chaîne. Par exemple, cela ne fonctionne pas :

Il est encore plus utile pour définir des valeurs par défaut :

Vous pouvez maintenant utiliser `` partout dans votre code et vous pouvez facilement modifier la valeur par défaut à tout moment.

99voto

Francesco Laurita Points 12027

Je pense que vous ne pouvez pas. Mais vous pouvez « formater » une chaîne que vous souhaitez :

Dans le code :

34voto

Mayank Mehta Points 216

Dans Android vous ne peut pas concaténer des chaînes XML

Qui suit n’est pas pris en charge

Visitez ce lien ci-dessous pour savoir comment y parvenir

Comment faire pour concaténer plusieurs chaînes XML android ?

7voto

schnatterer Points 730

Vous pouvez utiliser votre propre logique, qui résout de manière récursive les chaînes imbriquées.

D’un `` , par exemple, appelez-le comme suit

3voto

caspase Points 912

Je suis conscient que c'est un vieux post, mais je voulais partager les rapides " n sale solution que j'ai trouvé pour un projet de mine. Elle ne fonctionne que pour TextViews mais pourrait être adapté à d'autres widgets. Notez qu'il exige que le lien entre crochets (par exemple, [@string/foo]).

public class RefResolvingTextView extends TextView
{
    // ...

    @Override
    public void setText(CharSequence text, BufferType type)
    {
        final StringBuilder sb = new StringBuilder(text);
        final String defPackage = getContext().getApplicationContext().
                getPackageName();

        int beg;

        while((beg = sb.indexOf("[@string/")) != -1)
        {
            int end = sb.indexOf("]", beg);
            String name = sb.substring(beg + 2, end);
            int resId = getResources().getIdentifier(name, null, defPackage);
            if(resId == 0)
            {
                throw new IllegalArgumentException(
                        "Failed to resolve link to @" + name);
            }

            sb.replace(beg, end + 1, getContext().getString(resId));
        }

        super.setText(sb, type);
    }
}

L'inconvénient de cette approche est qu' setText() convertit l' CharSequence pour un String, ce qui est un problème si vous passez à des choses comme un SpannableString; pour ma ce projet n'était pas un problème puisque je ne les ai utilisé pour TextViews que je n'ai pas besoin accéder à partir de mon Activity.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X