Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/180.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 是否可以在strings.xml中为运行时值设置占位符?_Android_String_String Formatting_Android Resources - Fatal编程技术网

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$
    。将它们放置在资源字符串中的顺序并不重要,只影响提供参数的顺序

  • 格式化类型:有很多方法可以格式化内容()。以下是一些常见的问题:

  • s
    string

  • d
    十进制整数

  • f
    浮点数

#范例

我们将创建以下格式化字符串,其中灰色部分以编程方式插入

我妹妹玛丽今年12岁

string.xml

#注释

  • 我可以使用
    getString
    ,因为我参加了一个活动。如果上下文.getResources().getString(…)不可用,则可以使用它
  • String.format()
    也将格式化字符串
  • 1$
    2$
    术语不需要按该顺序使用。也就是说,
    2$
    可以位于
    1$
    之前。这在为使用不同语序的语言国际化应用程序时非常有用
  • 如果要重复,可以在xml中多次使用格式说明符,如
    %1$s
  • 有关更多详细信息,请阅读以下有用的教程:

Kotlin版本的公认答案

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