【问题标题】:Concatenate multiple strings in XML?在 XML 中连接多个字符串?
【发布时间】:2012-05-02 10:13:04
【问题描述】:

我浏览了这个How to concatenate multiple strings in android XML?,最后有 cmets

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>

查询:

是否可以仅在 xml 中进行一些连接,而不更改源代码?

我不想在代码中编辑的原因是因为我在xml/preferences.xml 中使用了这个字符串

例如:

&lt;ListPreference android:key="key_bbb" android:title="@string/bbb" ....

如果你明白我的意思,这里不可能使用这样的东西

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

【问题讨论】:

  • Not afaik - 仅支持“单个引用” - 它不会将两个或多个引用(或文本)连接到单个字符串中,例如&lt;string name="bbb"&gt;@strings/aaa&lt;/string&gt; 应该可以工作,而 &lt;string name="bbb"&gt;test @strings/aaa&lt;/string&gt; 被解释为原始字符串(因为它不是以引用开头) - 而 &lt;string name="bbb"&gt;@strings/aaa @strings/aaa&lt;/string&gt; 会失败,因为它会被解析为 single 参考。然而,他的问题的答案是用代码来做 - 这很有效。

标签: android xml string


【解决方案1】:

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

【讨论】:

  • 工作解决方案。谢谢。
【解决方案2】:

仅在 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 首选项问题有何建议?
  • 我知道答案与 XML 首选项无关。只有 xml 不能处理两个字符串的连接,它会给你编译错误,正如@MeAndWe 告诉你的那样。我给了你使用String.format() 连接两个字符串的想法
  • 想知道将应用程序名称附加到应用程序中的外部化字符串的标准做法是什么。不过,这非常接近。 :)
【解决方案3】:

不,我不认为你可以连接。

<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

【讨论】:

  • 查看 Savelii Zagurskii 的回答,了解在 xml 文件中多次重用字符串的方法。
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

    是的,如果您的 XML 文件使用 DataBinding,您可以这样做 正如你在link 中看到的那样

    像这样使用它:

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

    【讨论】:

    • 你也可以将字符串资源与@{@string/first_string + 'aaa'}这样的字符串连接起来
    【解决方案6】:

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

    【讨论】:

      【解决方案7】:

      是的,您可以这样做,而无需添加任何 Java/Kotlin 代码,只需添加 XML,只需使用以下库:https://github.com/LikeTheSalad/android-string-reference,它会在构建时执行此操作。

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

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

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

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

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

      【讨论】:

        【解决方案8】:

        这个技巧怎么样

        使用数组

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

        【讨论】:

          【解决方案9】:

          嗨,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))"
                    
          

          就是这样

          【讨论】:

            【解决方案10】:

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

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

            【讨论】:

              【解决方案11】:

              不可以,但可以在带有 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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2014-03-15
                • 1970-01-01
                • 1970-01-01
                • 2012-04-15
                • 2012-02-02
                • 2021-07-03
                相关资源
                最近更新 更多