web-dev-qa-db-de.com

Mehrere Strings in XML verketten?

Ich gehe durch dieses Wie verkette ich mehrere Strings in Android XML? Und am Ende gibt es Kommentare dazu 

For clarity, Its works: 

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

Ich habe mein eigenes Beispiel gemacht, aber es funktioniert nicht. So ist Andrzej falsch oder ich mache etwas falsch in meinem Code.

R.strings.bbb sollte "bbb aaa".__ enthalten, enthält jedoch anstelle von "bbb aaa""bbb @strings/aaa"

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

Abfrage:

Ist es möglich, eine Verkettung nur in XML durchzuführen, ohne dass der Quellcode geändert wird?

Grund, warum ich nicht im Code bearbeiten möchte, weil ich diese Zeichenfolgen in xml/preferences.xml verwende 

Zum Beispiel:

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

Wenn Sie wissen, was ich meine, gibt es hier keine Möglichkeit, so etwas zu verwenden

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

Nein, ich glaube nicht, dass du verketten kannst.

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

Ausgabe - bbb @ string/aaa

Wenn Sie tun,

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

Denn hier wird nach einem String mit der Referenz @string/aaa bbb gesucht, der nicht vorhanden ist.

Problem in Ihrem Fall war, wo Sie @strings/aaa verwendet haben, wobei @string/aaa

9
Lalit Poptani

Nein, Sie können Strings nicht in XML verketten, aber Sie können XML-Ressourcen definieren.

<?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>

Die ursprüngliche Antwort wurde hier veröffentlicht.

48

Nur in XML ist dies nicht möglich, aber mithilfe des Java-Codes können Sie die String.format()-Methode verwenden.

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

In Java-Code 

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

Der Titel wird also nach der Verkettung zweier Zeichenfolgen eine vollständige Zeichenfolge sein.

18
Dharmendra

Sie können die Ressourcen in gradle.build verketten:

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

Kotlin-Version:

zeichenfolgen in der 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>

und dann im 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

Ja, Sie können dies tun, wenn Ihre XML-Dateien DataBinding verwenden, wie Sie in diesem Link sehen können

Benutze es so:

"@{@string/first_string+ @string/second_string}"
0
batsheva

Wie wäre es mit dieser Technik?

Verwenden Sie ein Array

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

Und dann eine Methode in der Java-Klasse wie unten beschrieben

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

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

    return str;
}

Rufen Sie es jetzt aus einer beliebigen Java-Klasse als auf

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