在XML中连接多个字符串?

64

我阅读了这篇如何在android XML中连接多个字符串?的帖子,最后有一些评论:

为了清晰,它起作用:

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

我创建了自己的示例,但它无法使用。 那么是Andrzej错了还是我的代码有问题。

R.strings.bbb应该包含"bbb aaa",但实际上包含的是"bbb @strings/aaa"

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

查询:

在不更改源代码的情况下,是否可能仅在xml中进行一些连接操作?

我不想在代码中进行编辑的原因是因为我使用这些字符串在xml/preferences.xml文件中。

例如:

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

如果你知道我的意思,那么在这里是无法使用像这样的东西的。

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

1
似乎不行:https://dev59.com/d2sy5IYBdhLWcg3w9Svk - Blackbelt
目前来看,不支持连接两个或多个引用(或文本)成为一个字符串,只支持“单个引用”,例如<string name="bbb">@strings/aaa</string>是可以的,而<string name="bbb">test @strings/aaa</string>会被解释为原始字符串(因为它不以引用开头),<string name="bbb">@strings/aaa @strings/aaa</string>也会失败,因为它会被解析为单个引用。然而,他的问题的答案是在代码中实现的-这样做是可行的。 - Jens
11个回答

81

不,你不能在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>

这个答案最初发布在这里


1
可行的解决方案。谢谢。 - Zumbarlal Saindane
尝试过这个方法,但遇到的问题在 https://dev59.com/bVUL5IYBdhLWcg3wDUW2#51330953 已经有答案了。 - Bink

20

在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));

因此,标题将是两个字符串连接后的完整字符串。


你对我的 XML 首选项问题有什么建议? - Lukap
我知道答案与XML偏好无关。仅使用xml无法处理两个字符串的连接,这将导致编译错误,正如@MeAndWe所告诉您的那样。我已经给出了使用String.format()连接两个字符串的想法。 - Dharmendra
想知道在应用程序中将应用名称附加到外部化字符串的标准做法是什么。虽然这已经非常接近了。 :) - JaydeepW

15

我认为你不能进行拼接。

<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


3
请查看Savelii Zagurskii的回答以了解如何在XML文件中多次重用字符串。 - Andrew

9
你可以在 gradle.build 中连接资源:
    resValue "string", "TWITTER_CALLBACK", "twitter_callback_" + applicationId

8

如果您的XML文件使用DataBinding,您可以做到这一点,如此链接所示:链接

使用方式如下:

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

你可以像这样将字符串资源与字符串连接起来:@{@string/first_string + 'aaa'}。 - Onivas
1
它不起作用! - Vitaly

1
Kotlin 版本:
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)
)

1

如果你想添加多个字符串值,请尝试像这样

                        <TextView
                        ..........
                        android:text='@{String.format("%s %s","+91", userInfo.mobile)}'
                        .............. />

1

是的,您可以使用此库:https://github.com/LikeTheSalad/android-stem,仅使用XML而无需添加任何Java / Kotlin代码即可在构建时完成此操作。

对于您的情况,您需要像这样设置字符串:

<string name="aaa">Some text</string>
<string name="bbb">bbb ${aaa}</string>

然后这个库会在构建时创建以下内容:

<!-- Auto generated during compilation -->
<string name="bbb">bbb Some text</string>

免责声明:本库的作者是我。

0

这个技巧怎么样?

使用数组。

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

0

你好,concat可以像这样做:

   android:text="@{userInfo.firstName.concat(@string/empty_str).concat(userInfo.lastName)}"
         

我觉得这是动态数据的好样例。 但如果这个样例包含其他变量。比如用户名:Jon Doe

  android:text="@{String.format(@string/user_def,userInfo.firstName.concat(@string/empty_str).concat(userInfo.lastName))"
          

就是这样


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接