在XML中连接多个字符串?

时间:2012-05-02 10:13:04

标签: android xml string

我经历了这个How to concatenate multiple strings in android XML?,最后有评论

For clarity, Its works:

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

我做了我自己的例子,但它不起作用。 Andrzej 也是错误的,或者我在代码中做错了。

R.strings.bbb应包含"bbb aaa" 但它包含"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);

11 个答案:

答案 0 :(得分:50)

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

原始答案已发布here

答案 1 :(得分:18)

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

因此,在连接两个字符串之后,title将是一个完整的字符串。

答案 2 :(得分:9)

不,我认为你不能连接。

<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 :(得分:6)

您可以在gradle.build中连接资源:

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

答案 4 :(得分:1)

科特林版本:

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

答案 5 :(得分: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);

答案 6 :(得分:0)

是的,如果您的XML文件正在使用DataBinding,则可以这样做 如您在此link

中所见

像这样使用它:

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

答案 7 :(得分:0)

是的,您可以通过使用以下库来https://github.com/LikeTheSalad/android-string-reference,而不必添加任何Java / Kotlin代码(仅XML)即可。

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

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

然后该库将在构建时创建以下内容:

<string name="bbb">bbb Some text</string>

免责声明:我是这个图书馆的作者。

答案 8 :(得分: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))"
          

就这样

答案 9 :(得分:-1)

是的,这是完成此操作的完整方法。 使用数据绑定。

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
                    android:id="@+id/tv_one_month_price"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginBottom="16dp"
                    android:text="@{@string/string1 + @string/string2}"
                    />
</layout>

您可以在这里简单地在strings.xml文件中定义字符串。

<string name="string1">string1 text</string>
<string name="string2">string2 text</string>

很明显,您必须启用数据绑定,这是相同的链接。 https://developer.android.com/topic/libraries/data-binding/start

答案 10 :(得分:-3)

不,但在带有concat函数的xslt文件中是可行的:

<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