web-dev-qa-db-fra.com

Concaténer plusieurs chaînes en XML?

Je passe par ceci Comment concaténer plusieurs chaînes dans Android XML? et à la fin il y a des commentaires qui 

For clarity, Its works: 

<string name="title">@string/app_name</string>. - Andrzej Duś

J'ai fait mon propre exemple mais ça ne marche pas. _ (Andrzej} _ ne fonctionne pas correctement ou je fais quelque chose de mal dans mon code.

R.strings.bbb devrait contenir "bbb aaa" mais au lieu de "bbb aaa" il contient "bbb @strings/aaa"

<string name="aaa">aaa</string>
<string name="bbb">bbb @strings/aaa</string>

Requête:

Est-il possible de faire de la concaténation uniquement en XML, sans modification du code source?

Raison pour laquelle je ne veux pas éditer dans le code parce que j'utilise ces chaînes dans xml/preferences.xml 

Par exemple:

<ListPreference Android:key="key_bbb" Android:title="@string/bbb" ....

Si vous savez ce que je veux dire, ici il n'y a aucune possibilité d'utiliser quelque chose comme ça

String title = res.getString(R.string.title, appName);
36
Lukap

Non, je ne pense pas que vous puissiez concaténer.

<string name="aaa">aaa</string>
<string name="bbb">bbb @string/aaa</string>

Sortie - bbb @ string/aaa

Si tu fais,

<string name="aaa">aaa</string>
<string name="bbb">@string/aaa bbb</string>  -> This won't work it
                                                      will give compilation error

Parce qu'ici, il va chercher une chaîne avec la référence @string/aaa bbb qui n'existe pas.

Le problème dans votre cas était, vous utilisiez @strings/aaa qui devrait être @string/aaa

9
Lalit Poptani

Non, vous ne pouvez pas concaténer des chaînes en XML, mais vous pouvez définir des ressources XML.

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE resources [
  <!ENTITY appname "MyAppName">
  <!ENTITY author "MrGreen">
]>

<resources>
    <string name="app_name">&appname;</string>
    <string name="description">The &appname; app was created by &author;</string>
</resources>

La réponse originale a été postée ici .

48
Savelii Zagurskii

En XML uniquement, cela n’est pas possible, mais vous pouvez utiliser la méthode String.format() en utilisant le code Java.

<string name="aaa">aaa</string>
<string name="bbb">bbb %1$s</string>

En code Java 

String format = res.getString(R.string.bbb);
String title = String.format(format, res.getString(R.string.aaa));

Donc title sera une chaîne complète après la concaténation de deux chaînes.

18
Dharmendra

Vous pouvez concaténer les ressources dans gradle.build:

    resValue "string", "Twitter_CALLBACK", "Twitter_callback_" + applicationId
6
Boy

Version Kotlin:

chaînes dans le xml:

<string name="school_girl">Gogo Yubari</string>
<string name="assistant">Sofie Fatale</string>
<string name="boss">O-Ren Ishii</string>
<string name="list">%s, %s, %s</string>

et ensuite dans le code:

val killBillV1 = getString(R.string.list).format(
    Locale.US,
    getString(R.string.school_girl),
    getString(R.string.assistant),
    getString(R.string.boss)
)
1
netpork

Que diriez-vous de cette technique

Utilisez un tableau

<string name="app_link">https://myapp.com/</string>

<array name="update_dialog_msg">
    <item>Update can be downloaded manually by visiting this link:\n</item>
    <item>@string/app_link</item>
</array>

Et puis faire une méthode en classe Java comme ci-dessous

public String getStringArray(int resStringArray)
{
    String str = "";

    String[] strArray = mContext.getResources().getStringArray(resStringArray);
    for (String s: strArray)
    {
        str += s;
    }

    return str;
}

Maintenant, appelez-le depuis n'importe quelle classe Java

mDialog.setMessage(getStringArray(R.array.update_dialog_msg);
// OR
textView.setText(getStringArray(R.array.update_dialog_msg);
0
Waqar Aslam