动态字符串使用String.xml?

是否有可能在string.xml中的字符串值的占位符,可以在运行时分配值?

例:

一些字符串PLACEHOLDER1多一些字符串

格式和样式

是的,从字符串资源中看到以下内容:格式和样式

如果你需要使用String.format(String, Object...)来格式化你的字符串,那么你可以通过把你的格式参数放在字符串资源里。 例如,使用以下资源:

 <string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string> 

在这个例子中,格式字符串有两个参数:%1 $ s是一个字符串,%2 $ d是一个十进制数字。 你可以使用你的应用程序的参数格式化字符串,如下所示:

 Resources res = getResources(); String text = String.format(res.getString(R.string.welcome_messages), username, mailCount); 

基本用法

请注意, getString有一个使用字符串作为格式字符串的重载:

 String text = res.getString(R.string.welcome_messages, username, mailCount); 

复数

如果你需要处理复数,使用这个:

 <plurals name="welcome_messages"> <item quantity="one">Hello, %1$s! You have a new message.</item> <item quantity="other">Hello, %1$s! You have %2$d new messages.</item> </plurals> 

第一个mailCount参数用于决定使用哪种格式(单个或复数),其他参数是你的替换:

 Resources res = getResources(); String text = res.getQuantityString(R.plurals.welcome_messages, mailCount, username, mailCount); 

请参阅字符串资源:复数了解更多详情。

当你想从实际的strings.xml文件中使用一个参数而不使用任何Java代码时:

 <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE resources [ <!ENTITY appname "WhereDat"> <!ENTITY author "Oded"> ]> <resources> <string name="app_name">&appname;</string> <string name="description">The &appname; app was created by &author;</string> </resources> 

这不适用于跨资源文件,即必须将变量复制到每个需要它们的XML文件中。

补充答案

当我在接受的答案中第一次看到%1$s%2$d时,没有任何意义。 这里是更多的解释。

xml中的字符串格式替换标记的形式是

 %[parameter index]$[format type] 
  • 参数索引 :如果您想要替换的字符串的三个部分,那么它们将被称为%1%2%3 。 您将它们放置在资源字符串中的顺序无关紧要,只是您在String.format提供参数的顺序。
  • 格式类型 :有很多方法可以对事物进行格式化( 请参阅文档 )。 这里有一些常见的:

    • $s字符串
    • $d十进制整数
    • $f浮点数

我们将创建以下格式化的字符串,灰色部分以编程方式插入。

我的妹妹Mary 12岁。

string.xml

 <string name="my_xml_string">My sister %1$s is %2$d years old.</string> 

MyActivity.java

 String myString = "Mary"; int myInt = 12; String formatted = getString(R.string.my_xml_string, myString, myInt); 

笔记

  • 我可以使用getString因为我在一个Activity中。 如果不可用,可以使用context.getResources().getString(...)
  • String.format()也将格式化一个字符串。
  • %1%2项不需要按顺序使用。 也就是说, %2可以在%1之前。 当为使用不同词序的语言应用程序国际化时,这非常有用。
  • 如果你想重复,你可以在xml中多次使用像%1$s这样的术语。
  • 使用%%来获取实际的%字符。
  • 有关更多详细信息,请阅读以下有用教程: Android SDK快速提示:格式化资源字符串

正在寻找相同的,终于找到了以下非常简单的解决方案。 最好的:它开箱即用。
1.改变你的字符串资源:

 <string name="welcome_messages">Hello, <xliff:g name="name">%s</xliff:g>! You have <xliff:g name="count">%d</xliff:g> new messages.</string> 

2.使用字符串替换:

c.getString(R.string.welcome_messages,name,count);

其中c是上下文, 名称是一个字符串变量,并计数您的int变量

你需要包括

 <resources xmlns:xliff="http://schemas.android.com/apk/res-auto"> 

在你的res / strings.xml中。 为我工作。 🙂

不过,你也应该阅读EliasMårtenson关于“零”的Android复数治疗的答案。 某些值的解释存在问题,例如“零”。

Kotlin版本的接受答案…

 val res = resources val text = String.format(res.getString(R.string.welcome_messages), username, mailCount) 

在Kotlin中,你只需要像这样设置你的字符串值:

 <string name="song_number_and_title">"%1$d ~ %2$s"</string> 

在你的布局上创建一个文本视图:

 <TextView android:id="@+id/song_number_and_title"/> 

如果你使用Anko,那么在你的代码中这样做:

 val song = database.use { // get your song from the database } song_number_and_title.setText(resources.getString(R.string.song_number_and_title, song.number, song.title)) 

您可能需要从应用程序上下文获取资源。

您可以使用MessageFormat

 <string name="customer_address">Wellcome: {0} {1}</string> 

在Java代码中:

 String text =MessageFormat(R.string.customer_address).format("Name","Family"); 

API级别1:

https://developer.android.com/reference/java/text/MessageFormat.html