Объединить несколько строк в XML?

Я прохожу через Как конкатенировать несколько строк в android XML?, и в конце есть комментарии, которые

For clarity, Its works:

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

Я сделал свой собственный пример, но он не работает. Так что Andrzej ошибается, или я делаю что-то неправильно в своем коде.

R.strings.bbb должен содержать "bbb aaa" но вместо "bbb aaa" он содержит "bbb @strings/aaa"

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

Query:

Можно ли выполнить некоторую конкатенацию только в xml без изменений исходного кода?

Причина, по которой я не хочу редактировать код, потому что я использую эти строки в xml/preferences.xml

Пример:

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

Если вы знаете, что я имею в виду, здесь нет возможности использовать что-то вроде этого

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

Ответ 1

Нет, я не думаю, что вы можете объединиться.

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

Вывод - bbb @string/aaa

Если вы это сделаете,

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

Потому что здесь он будет искать строку со ссылкой @string/aaa bbb, которая не существует.

Проблема в вашем случае была, вы используете @strings/aaa, который должен быть @string/aaa

Ответ 2

Нет, вы не можете конкатенировать строки в XML, но вы можете определить ресурсы 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>

Оригинальный ответ был отправлен здесь.

Ответ 3

В XML это невозможно, но с использованием java-кода вы можете использовать метод String.format().

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

В java-коде

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

Итак, заголовок будет полной строкой после конкатенации двух строк.

Ответ 4

Вы можете объединить ресурсы в gradle.build:

    resValue "string", "TWITTER_CALLBACK", "twitter_callback_" + applicationId

Ответ 5

Котлин версия:

строки в 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>

а затем в коде:

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

Ответ 6

Как насчет этой техники

Использовать массив

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

А затем сделать метод в классе Java, как показано ниже

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

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

    return str;
}

Теперь вызывайте его из любого Java-класса как

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

Ответ 7

Да, вы можете сделать это, если ваши XML файлы используют DataBinding, как вы видите по этой ссылке

Используйте это так:

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