使用String.xml的动态字符串?

Sof*_*nce 442 string android string-formatting android-resources

是否可以在字符串值中包含占位符string.xml,可以在运行时分配值?

例:

一些字符串PLACEHOLDER1更多字符串

Meg*_*Rel 950

格式和样式

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

如果需要使用格式化字符串String.format(String, Object...),则可以通过将格式参数放在字符串资源中来实现.例如,使用以下资源:

<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>
Run Code Online (Sandbox Code Playgroud)

在此示例中,格式字符串有两个参数:%1$s是字符串,%2$d是十进制数.您可以使用应用程序中的参数格式化字符串,如下所示:

Resources res = getResources();
String text = String.format(res.getString(R.string.welcome_messages), username, mailCount);
Run Code Online (Sandbox Code Playgroud)

基本用法

请注意,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)

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

  • 第一代码示例中的String.format呼叫实际上是没有必要的,Resources.getString()支持的格式,见:http://developer.android.com/reference/android/content/res/Resources.html#getString(int ,java.lang.Object ...) (58认同)
  • 对于String.xml中的Plurals,您需要将id设为R.plurals.welcome_messages而不是R.string.welcome_messages (16认同)
  • 字符串代表%1 $ s,小数字代表%2 $ d,整数代表什么?是什么意思%1,%2.这是参数的计数?.如果我想要第三个参数提到%3? (3认同)

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中多次使用格式说明符.
  • 使用%%以获得实际%的性格.
  • 有关更多详细信息,请阅读以下有用的教程:Android SDK快速提示:格式化资源字符串


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文件中.

  • 有什么方法可以在单独的文件中定义`&lt;!DOCTYPE ...]&gt;`部分,并将其包含在多个资源文件中?有什么技巧可以做到这一点? (2认同)

小智 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中.适合我.:)

  • 格式说明符周围的`xliff`标签有什么意义?与仅仅使用`%s`和`%d`说明符相比,它们增加了多少额外值? (2认同)

Coo*_*ind 9

如果要写百分比 (%),请复制它:

<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)

您可能需要从应用程序上下文中获取资源。

  • 那与java示例有什么不同?我没看见有分别 (6认同)