Android XML百分比符号


309

我有一个%使用符号的字符串数组。使用%is的正确格式%。当我在该数组中有多个字符串时,%会出现此错误。

 Multiple annotations found at this
 line:
 - error: Multiple substitutions specified in non-positional format;
   did you mean to add the formatted="false" attribute?
 - error: Found tag </item> where </string-array> is expected

6
您可以发布导致此错误的XML吗?在没有发现问题原因的情况下很难确定问题。
克里斯·卡什韦尔

这是一个错误,可以轻易地由任何带有2个或更多%符号的字符串来复制。
zaid 2010年

如果不寻找格式化目的,则更好的方法来完成。
Shishir Gupta 2014年

就我而言,我错误地将格式设置参数输入为1%$ s,而不是%1 $ s。
Ashokchakravarthi Nagarajan

Answers:


467

Android Asset Packaging Tool(aapt在其最新版本中已变得非常严格,现已用于所有 Android版本。因为不再允许非位置格式说明符,所以会生成您所得到的aapt-error 。

这里有一些想法,您可以如何在资源字符串中包含%符号。

如果您的字符串中不需要任何格式说明符或替换,则只需使用该formatted属性并将其设置为false

<string formatted="false">%a + %a == 2%a</string>

在这种情况下,该字符串不用作的格式字符串,Formatter因此您不必转义%符号。结果字符串为“%a +%a == 2%a”。

如果省略该formatted="false"属性,则该字符串将用作格式字符串,并且必须转义%符号。使用double-%可以正确完成此操作:

<string>%%a + %%a == 2%%a</string>

现在aapt不会给您任何错误,但是如果Formatter调用a而没有任何格式参数,则根据您的使用方式,结果字符串可以是“ %% a + %% a == 2 %% a” :

Resources res = context.getResources();

String s1 = res.getString(R.string.str);
// s1 == "%%a + %%a == 2%%a"

String s2 = res.getString(R.string.str, null);
// s2 == "%a + %a == 2%a"

没有任何xml和代码,很难说出您的问题到底是什么,但是希望这可以帮助您更好地理解机制。


1
我选择了这个作为答案,因为它应该可以工作,但是显然我在该字符串中遇到了一个错误,因此我决定使用%%和“ XXX.replaceAll(” %%“,”%“);”
zaid 2010年

4
使用formatted = false效果很好。这就是我的用法:<string name =“ information_description” formatted =“ false”> \'Sweet \'10%到20%甚至35%重量的糖</ string>
某处某人

1
formatted = false对我也很好。使用%%,它确实表明了我的设备和仿真器上%% ..
samwize

过去,formatted = false对我来说效果很好。现在(ADT 22),由于某种原因它没有。并且如果我使用:“ str = mContext.getString(R.string.str,” hello“)”,它将出现以下警告:“格式字符串'str'不是有效的格式字符串,因此不应传递给String.format”
android开发人员

1
如果要从<string-array />访问,则为打印百分比,请使用\ u0025。这对我有用。
Chintan Shah 2015年

157

要允许应用使用资源中的格式化字符串,您应该更正xml。因此,例如

<string name="app_name">Your App name, ver.%d</string>

应该替换为

<string name="app_name">Your App name, ver.%1$d</string>

您可以查看以获取详细信息。


2
谢谢,您确实提供了缺失的链接。
2014年

22
对于多个参数替换(例如,用字符串),使用%1$s%2$s等等
CJBS

1
谁会为这个小东西读这么大的答案?谢谢,我向下滚动找到您。
Janaka R Rajapaksha

73

您可以对XML解析器使用%%来转义%,但设备中会显示两次。

要显示一次,请尝试以下格式: \%%

例如

<string name="zone_50">Fat Burning (50\%% to 60\%%)</string> 

Fat Burning (50% to 60%)设备所示


6
\ %%导致Nexus 4 4.2.1崩溃。尚未测试其他人。
乔恩·威利斯,

当您已经知道要包含在字符串中的百分比时,这比使用字符串格式化程序和始终必须以编程方式设置这些硬编码值的方法好用,并且很容易。
投资组合建立者

这对我来说在Nexus 5.1.1上也崩溃了。@ViliusK答案是正确的。
陈景宏

2
只需使用%%代替%
Sundeep1501 '18年

36

采用

<string name="win_percentage">%d%% wins</string>

要得到

80% wins 作为格式化的字符串。

我正在使用String.format()method而不是插入数字%d



9

要逃脱百分比符号,您只需要%%

例如 :

String.format("%1$d%%", 10)

返回“ 10%”


1
您的答案与其他几个现有答案几乎相同
Ben Rhys-Lewis

...是错误的,因为10%没有返回%10。回答:使用时,String.format您应每次指定区域设置。当您不使用语言环境并将阿拉伯语言环境用作格式数字时,您可能会感到非常惊讶……
mtrakal

7

不完全是您的问题,而是类似的问题。

如果字符串条目中包含多种格式,则不应多次使用“%s”。

别 :

<string name="entry">Planned time %s - %s (%s)</string>

要做:

<string name="entry">Planned time %1$s - %2$s (%3$s)</string>

5

您可以使用%%对xml中的%进行转义,但是您需要在代码中而不是在布局xml中设置文本。


1
是的,它的确逃脱了%的两倍,并且可以很好地编译。但是,在仿真器甚至设备上运行时,它可能会显示为%%。
2011年

5

这可能是IDE变得过于严格的情况。

这个想法很合理,通常应指定替换变量的顺序,以便在添加其他语言的资源时,无需更改Java代码。但是,这有两个问题:

首先,一个字符串如:

You will need %.5G %s

被使用,因为您将需要2.1200 mg在任何语言中具有相同的顺序,因为质量始终以科学的顺序表示。

第二个是,如果您以任何一种语言(默认语言)指定变量的顺序(例如英语),那么您只需要在资源字符串中指定语言的位置即可,这些语言使用与默认语言不同的顺序。

好消息是这很容易解决。即使无需指定位置并且IDE过于严格,也无论如何都可以指定它们。对于上面的示例,使用:

您将需要%1 $ .5G%2 $ s



3

试试这个(右):

<string name="content" formatted="false">Great application %s  ☞  %s  ☞  %s \\n\\nGo to download this application %s</string>


-1

假设您要显示(50%OFF)并在运行时输入50。这是代码:

<string name="format_discount"> (
<xliff:g id="discount">%1$s</xliff:g>
<xliff:g id="percentage_sign">%2$s</xliff:g>
 OFF)</string>

在java类中,使用以下代码:

String formattedString=String.format(context.getString(R.string.format_discount),discountString,"%");
holder1.mTextViewDiscount.setText(formattedString);

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.