动态字符串使用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
- Kotlin DialogFragment editText可编辑始终为空
- 在Kotlin的对象字段中带有上下文的Android类
- 我怎样才能在房间持久库中动态的列名构造SQL查询
- 如何使用Android画布绘制矩形只有顶部和顶部的矩形圆?
- 如何直接从我的Android应用程序打开Google Play商店?
- 在根项目中找不到Android Kotlin Task调试
- 在Android中kotlin不支持Socket IO
- Kotlin注释处理器+ AutoService
- java.lang.ClassNotFoundException:未在路径中找到类“com.my.app.example.Main”:DexPathList