Объединить несколько строк в 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}"
Ответ 8
Нет, но возможно в файле xslt с функцией concat:
<html>
<body>
<ul>
<xsl:for-each select="stock">
<xsl:if test="starts-with(@symbol, 'C')">
<li>
<xsl:value-of select="concat(@symbol,' - ', name)" />
</li>
</xsl:if>
</xsl:for-each>
</ul>
</body>
</html>
http://www.java2s.com/Tutorial/XML/0100__XSLT-stylesheet/concatfunction.htm