是否string.xml
可以在运行时分配字符串值中的占位符?
例:
一些字符串PLACEHOLDER1一些其他字符串
是否string.xml
可以在运行时分配字符串值中的占位符?
例:
一些字符串PLACEHOLDER1一些其他字符串
Answers:
如果您需要使用来格式化字符串
String.format(String, Object...)
,则可以通过将format参数放在字符串资源中来实现。例如,使用以下资源:<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);
有关更多详细信息,请参见字符串资源:复数。
当我第一次看到%1$s
并%2$d
接受接受的答案时,这没有任何意义。这里有更多解释。
它们被称为格式说明符。在xml字符串中,它们的形式为
%[parameter_index$][format_type]
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>
MyActivity.java
String myString = "Mary";
int myInt = 12;
String formatted = getString(R.string.my_xml_string, myString, myInt);
getString
因为我处于活动状态。context.getResources().getString(...)
如果不可用,可以使用。String.format()
还将格式化字符串。1$
和2$
术语并不需要按顺序使用做。也就是说,2$
可以先于1$
。在将应用国际化为使用不同字序的语言时,这很有用。%1$s
如果要重复,可以在xml中多次使用格式说明符。%%
以获得实际%
的性格。当您想使用实际的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文件中。
<!DOCTYPE... ]>
在单独的文件中定义零件并将其包含在多个资源文件中?有什么技巧可以做到这一点?
一直在寻找相同的东西,终于找到了以下非常简单的解决方案。最佳:开箱即用。
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是上下文,name是一个字符串变量,并计算 int变量
您需要包括
<resources xmlns:xliff="http://schemas.android.com/apk/res-auto">
在您的res / strings.xml中。为我工作。:)
xliff
周围的格式说明标签?与仅使用%s
and %d
指示符相反,它们还增加了什么附加值?
在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))
您可能需要从应用程序上下文中获取资源。
但是,您还应该阅读EliasMårtenson关于Android的“零”复数处理的答案。某些值(例如“零”)的解释存在问题。
在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代码
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);
您可以使用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
是! 您无需编写任何Java / Kotlin代码,而只需编写XML,就可以使用我创建的这个小库,在构建时就可以这样做,因此您的应用程序不会受到它的影响:https : //github.com/LikeTheSalad/android -字符串参考
用法
您的字符串:
<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>
Kotlin的直接解决方案:
strings.xml
<string name="customer_message">Hello, %1$s!\nYou have %2$d Products in your cart.</string>
kotlinActivityORFragmentFile.kt:
val username = "Andrew"
val products = 1000
val text: String = String.format(
resources.getString(R.string.customer_message), username, products )
在您的字符串文件中使用
<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)));
Kotlin版本已接受的答案...
val res = resources
val text = String.format(res.getString(R.string.welcome_messages), username, mailCount)
resources.getString(int, ... args)
带参数的方法代替String.format
。此代码中也没有kotlin细节,val
关键字除外。请参阅msbodw001的答案