Android 是否可以在strings.xml中为运行时值设置占位符?
在Android 是否可以在strings.xml中为运行时值设置占位符?,android,string,string-formatting,android-resources,Android,String,String Formatting,Android Resources,在string.xml中的字符串值中是否可以有占位符,这些占位符可以在运行时分配值 例如: 一些字符串占位符1更多字符串 格式和样式 是的,请参见以下内容 如果需要使用String.format(String,Object…)格式化字符串,则可以将格式参数放入字符串资源中。例如,使用以下资源: <string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string> 基本用法 请注
string.xml
中的字符串值中是否可以有占位符,这些占位符可以在运行时分配值
例如:
一些字符串占位符1更多字符串
格式和样式
是的,请参见以下内容
如果需要使用String.format(String,Object…)
格式化字符串,则可以将格式参数放入字符串资源中。例如,使用以下资源:
<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>
基本用法
请注意,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>
有关更多详细信息,请参阅。但是,您还应该阅读上的答案。如果要使用实际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>
]>
&appname;
&appname;应用程序由&author;
这不适用于资源文件,即必须将变量复制到每个需要它们的XML文件中。正在寻找相同的方法,最终找到了以下非常简单的解决方案。最佳:开箱即用。
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>
在res/strings.xml中。
为我工作。:) #补充回答
当我第一次在公认的答案中看到%1$s
和%2$d
时,它毫无意义。这里有更多的解释
它们被称为格式说明符。在xml字符串中,它们的形式为
%[parameter_index$][format_type]
- %:百分号标记格式说明符的开头
- 参数索引:这是一个后跟美元符号的数字。如果有三个参数要插入字符串中,那么它们将被称为
、1$
和2$
。将它们放置在资源字符串中的顺序并不重要,只影响提供参数的顺序3$
- 格式化类型:有很多方法可以格式化内容()。以下是一些常见的问题:
strings
十进制整数d
浮点数f
- 我可以使用
,因为我参加了一个活动。如果上下文.getResources().getString(…)不可用,则可以使用它getString
也将格式化字符串String.format()
和1$
术语不需要按该顺序使用。也就是说,2$
可以位于2$
之前。这在为使用不同语序的语言国际化应用程序时非常有用1$
- 如果要重复,可以在xml中多次使用格式说明符,如
%1$s
- 有关更多详细信息,请阅读以下有用的教程:
val res = resources
val text = String.format(res.getString(R.string.welcome_messages), username, mailCount)
您可以使用
MessageFormat
:
<string name="customer_address">Wellcome: {0} {1}</string>
API 1级:
在Kotlin中,您只需如下设置字符串值:
Resources res = getResources();
String text = String.format(res.getString(R.string.welcome_messages), username, mailCount);
<string name="song_number_and_title">"%1$d ~ %2$s"</string>
您可能需要从应用程序上下文中获取资源。在res/values/string.xml中
<resources>
<string name="app_name">Hello World</string>
<string name="my_application">Application name: %s, package name: %s</string>
</resources>
对!!您无需编写任何Java/Kotlin代码,只需使用我创建的这个小型库(它在构建时执行),就可以实现XML,这样您的应用程序就不会受到影响: 用法
String[] args = new String[2];
args[0] = context.getString(R.string.app_name);
args[1] = context.getPackageName();
String textMessage = context.getString(R.string.my_application,(Object[]) args);
您的字符串:
<resources>
<string name="app_name">My App Name</string>
<string name="template_welcome_message">Welcome to ${app_name}</string>
</resources>
我的应用程序名称
欢迎使用${app_name}
生成后生成的字符串:
<!--resolved.xml-->
<resources>
<string name="welcome_message">Welcome to My App Name</string>
</resources>
欢迎使用我的应用程序名称
问题的直接Kotlin解决方案:
strings.xml
如果要写入百分比(%),请复制它:
<string name="percent">%1$d%%</string>
label.text = getString(R.string.percent, 75) // Output: 75%.
%1$d%%
label.text=getString(R.string.percent,75)//输出:75%。
如果只编写
%1$d%
,则会出现错误:格式字符串“percent”不是有效的格式字符串,因此不应将其传递给字符串。在字符串文件中使用此
<string name="redeem_point"> You currently have %s points(%s points = 1 %s)</string>
第一个代码示例中的String.format调用实际上不是必需的,参考资料。getString()支持格式化,请参阅:,java.lang.Object…)对于String.xml中的复数形式,您需要将id设置为R.Plurals.welcome\u messages,而不是R.String.welcome\u messages仅返回最后一个项目字符串…您知道如何获取追加字符串吗。使用此方法格式化字符串时,它删除了xml字符串中可能包含的所有元标记,如超链接等。textString代表%1$s,decimal代表%2$d,integer代表什么?%1、%2是什么意思?这是参数的计数吗?如果我想让第三个参数提到%3?可能是@HarishGyanani的重复项否,这一个比较旧,这是一个很好的答案,除非你有一个参数在里面。有没有办法在一个单独的文件中定义
部分并将其包含在多个资源文件中?实现这一点的技巧是什么?不使用API级别29更正确的方法是使用带有参数的resources.getString(int,…args)
方法,而不是String.format
。除val
关键字外,此代码中也没有kotlin的详细信息。请参阅MSBODW001的答案格式说明符周围的xliff
标记的意义是什么?与单独使用%s
和%d
说明符相比,它们增加了什么额外的值?xliff标记中的“name”属性只是一种向翻译器提示将在其中替换什么的方法。有时很难猜出“%s”是什么意思。“xliff:
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))
<resources>
<string name="app_name">Hello World</string>
<string name="my_application">Application name: %s, package name: %s</string>
</resources>
String[] args = new String[2];
args[0] = context.getString(R.string.app_name);
args[1] = context.getPackageName();
String textMessage = context.getString(R.string.my_application,(Object[]) args);
<resources>
<string name="app_name">My App Name</string>
<string name="template_welcome_message">Welcome to ${app_name}</string>
</resources>
<!--resolved.xml-->
<resources>
<string name="welcome_message">Welcome to My App Name</string>
</resources>
<string name="customer_message">Hello, %1$s!\nYou have %2$d Products in your cart.</string>
val username = "Andrew"
val products = 1000
val text: String = String.format(
resources.getString(R.string.customer_message), username, products )
<string name="percent">%1$d%%</string>
label.text = getString(R.string.percent, 75) // Output: 75%.
<string name="redeem_point"> You currently have %s points(%s points = 1 %s)</string>
coinsTextTV.setText(String.format(getContext().getString(R.string.redeem_point), rewardPoints.getReward_points()
, rewardPoints.getConversion_rate(), getString(R.string.rs)));