dynamicstring使用String.xml?
是否有可能在string.xml
中的string值的占位符,可以在运行时分配值?
例:
一些stringPLACEHOLDER1多一些string
格式和样式
是的,从string资源中看到以下内容:格式和样式
如果你需要使用
String.format(String, Object...)
来格式化你的string,那么你可以通过把你的格式参数放在string资源里。 例如,使用以下资源:<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>
在这个例子中,格式string有两个参数:%1 $ s是一个string,%2 $ d是一个十进制数字。 你可以使用你的应用程序的参数格式化string,如下所示:
Resources res = getResources(); String text = String.format(res.getString(R.string.welcome_messages), username, mailCount);
基本用法
请注意, getString
有一个使用string作为格式string的重载:
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参数用于决定使用哪种格式(单个或复数),其他参数是你的replace:
Resources res = getResources(); String text = res.getQuantityString(R.plurals.welcome_messages, mailCount, username, mailCount);
请参阅string资源:复数了解更多详情。
当你想从实际的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>
这不适用于跨资源文件,即必须将variables复制到每个需要它们的XML文件中。
补充答案
当我在接受的答案中第一次看到%1$s
和%2$d
时,没有任何意义。 这里是更多的解释。
xml中的string格式replace标记的forms是
%[parameter index]$[format type]
- 参数索引 :如果您想要replace的string的三个部分,那么它们将被称为
%1
,%2
和%3
。 您将它们放置在资源string中的顺序无关紧要,只是您在String.format
提供参数的顺序。 -
格式types :有很多方法可以对事物进行格式化( 请参阅文档 )。 这里有一些常见的:
-
$s
string -
$d
十进制整数 -
$f
浮点数
-
例
我们将创build以下格式化的string,灰色部分以编程方式插入。
我的妹妹
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()
也将格式化一个string。 -
%1
和%2
项不需要按顺序使用。 也就是说,%2
可以在%1
之前。 当为使用不同词序的语言应用程序国际化时,这非常有用。 - 如果你想重复,你可以在xml中多次使用像
%1$s
这样的术语。 - 使用
%%
来获取实际的%
字符。 - 有关更多详细信息,请阅读以下有用教程: Android SDK快速提示:格式化资源string
正在寻找相同的,终于find了以下非常简单的解决scheme。 最好的:它开箱即用。
1.改变你的string资源:
<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.使用stringreplace:
c.getString(R.string.welcome_messages,name,count);
其中c是上下文, 名称是一个stringvariables,并计数您的intvariables
你需要包括
<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值:
<string name="song_number_and_title">"%1$d ~ %2$s"</string>
在你的布局上创build一个文本视图:
<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