Sof*_*nce 442 string android string-formatting android-resources
是否可以在字符串值中包含占位符string.xml
,可以在运行时分配值?
例:
一些字符串PLACEHOLDER1更多字符串
Meg*_*Rel 950
是,请参阅字符串资源:格式和样式中的以下内容
如果需要使用格式化字符串
String.format(String, Object...)
,则可以通过将格式参数放在字符串资源中来实现.例如,使用以下资源:Run Code Online (Sandbox Code Playgroud)<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>
在此示例中,格式字符串有两个参数:
%1$s
是字符串,%2$d
是十进制数.您可以使用应用程序中的参数格式化字符串,如下所示:Run Code Online (Sandbox Code Playgroud)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);
Run Code Online (Sandbox Code Playgroud)
如果您需要处理复数,请使用:
<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>
Run Code Online (Sandbox Code Playgroud)
第一个mailCount
参数用于决定使用哪种格式(单个或复数),其他参数是您的替换:
Resources res = getResources();
String text = res.getQuantityString(R.plurals.welcome_messages, mailCount, username, mailCount);
Run Code Online (Sandbox Code Playgroud)
有关更多详细信息,请参见字符串资源:复数
Sur*_*gch 233
当我第一次看到%1$s
并且%2$d
在接受的答案中,这没有任何意义.这是一个更多的解释.
它们被称为格式说明符.在xml字符串中,它们的形式为
%[parameter_index$][format_type]
Run Code Online (Sandbox Code Playgroud)
1$
,2$
和3$
.您将它们放在资源字符串中的顺序无关紧要,只与您提供参数的顺序无关.格式类型:有很多方法可以格式化(参见文档).以下是一些常见的:
s
串d
十进制整数f
浮点数我们将创建以下格式化字符串,其中以编程方式插入灰色部分.
我妹妹
Mary
已经12
岁了.
string.xml
<string name="my_xml_string">My sister %1$s is %2$d years old.</string>
Run Code Online (Sandbox Code Playgroud)
MyActivity.java
String myString = "Mary";
int myInt = 12;
String formatted = getString(R.string.my_xml_string, myString, myInt);
Run Code Online (Sandbox Code Playgroud)
getString
因为我在一个活动中.context.getResources().getString(...)
如果不可用,您可以使用.String.format()
还将格式化一个字符串.1$
和2$
条款不需要按顺序使用.也就是说,2$
可以来1$
.在将应用程序国际化为使用不同单词顺序的语言时,这非常有用.%1$s
如果要重复,可以在xml中多次使用格式说明符.%%
以获得实际%
的性格.Ode*_*ner 120
如果要在不使用任何Java代码的情况下使用实际strings.xml文件中的参数:
<?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>
Run Code Online (Sandbox Code Playgroud)
这不适用于资源文件,即必须将变量复制到需要它们的每个XML文件中.
小智 17
正在寻找相同的,终于找到了以下非常简单的解决方案.最好:它开箱即用.
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>
Run Code Online (Sandbox Code Playgroud)
2.使用字符串替换:
c.getString(R.string.welcome_messages,name,count);
其中c是Context,name是一个字符串变量并计算你的int变量
你需要包括
<resources xmlns:xliff="http://schemas.android.com/apk/res-auto">
Run Code Online (Sandbox Code Playgroud)
在你的res/strings.xml中.适合我.:)
如果要写百分比 (%),请复制它:
<string name="percent">%1$d%%</string>
label.text = getString(R.string.percent, 75) // Output: 75%.
Run Code Online (Sandbox Code Playgroud)
如果你简单地写%1$d%
,你会得到错误:Format string 'percent' is not a valid format string so it should not be passed to String.format
。
或者用 formatted=false"
它代替。
小智 5
在 Kotlin 中,您只需要像这样设置字符串值:
<string name="song_number_and_title">"%1$d ~ %2$s"</string>
Run Code Online (Sandbox Code Playgroud)
在你的布局上创建一个文本视图:
<TextView android:text="@string/song_number_and_title"/>
Run Code Online (Sandbox Code Playgroud)
如果您使用 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))
Run Code Online (Sandbox Code Playgroud)
您可能需要从应用程序上下文中获取资源。
归档时间: |
|
查看次数: |
228363 次 |
最近记录: |