动态字符串使用String.xml?

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

例:

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

格式和样式

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

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

 Hello, %1$s! You have %2$d new messages. 

在这个例子中,格式字符串有两个参数:%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); 

复数

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

  Hello, %1$s! You have a new message. Hello, %1$s! You have %2$d new messages.  

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

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

有关更多详细信息,请参阅字符串资源:复数

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

    ]>  &appname; The &appname; app was created by &author;  

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

补充答案

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

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

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

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

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

我的妹妹Mary 12岁。

string.xml

 My sister %1$s is %2$d years old. 

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快速提示:格式化资源字符串

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

 Hello, %s! You have %d new messages. 

2.使用字符串替换:

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

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

你需要包括

  

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

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

Kotlin版本的接受答案…

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

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

 "%1$d ~ %2$s" 

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

  

如果你使用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

 Wellcome: {0} {1} 

在Java代码中:

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

API级别1:

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