是否可以在Android中动态将String添加到String.xml?

本小妞迷上赌 提交于 2020-02-26 01:08:04

string.xml字符串值中string.xml可以在运行时分配占位符?

例:

一些字符串PLACEHOLDER1一些其他字符串


#1楼

但是,您还应该阅读EliasMårtenson关于Android的“零”复数处理的答案。 某些值(例如“零”)的解释存在问题。


#2楼

当您想使用实际的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文件中。


#3楼

一直在寻找相同的东西,终于找到了以下非常简单的解决方案。 最佳:开箱即用。
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中。 为我工作。 :)


#4楼

格式和样式

是的,请参阅字符串资源中的以下内容:格式和样式

如果需要使用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);

有关更多详细信息,请参见字符串资源:复数


#5楼

补充答案

当我第一次在接受的答案中看到%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$ 。 在将应用国际化为使用不同字序的语言时,这很有用。
  • 如果要重复,可以在xml中多次使用%1$s类的格式说明符。
  • 使用%%获取实际的%字符。
  • 有关更多详细信息,请阅读以下有用的教程: Android SDK快速提示:格式化资源字符串
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!