Android XML百分比符号

我有一个使用%符号的string数组。 正确的格式使用%% 。 当我有一个string在该数组与多个% 它给了我这个错误。

  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 

Android资源打包工具( aapt ) 在其最新版本中变得非常严格,现在已经用于所有 Android版本。 生成的aapt-error是因为它不再允许非位置格式说明符而生成的 。

这里有一些你可以如何在你的资源string中包含%-symbol的想法。

如果在string中不需要任何格式说明符或replace,则可以简单地使用formatted属性并将其设置为false

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

在这种情况下,string不用作格式化程序的Formatterstring,因此您不必转义%-symbols。 结果string是“%a +%a == 2%a”。

如果省略了formatted="false"属性,则该string将用作格式string,并且必须转义%-symbols。 这是正确完成与双%:

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

现在, aapt给你带来任何错误,但是根据你的使用方式,如果一个Formatter被调用时没有任何格式参数 ,结果string可以是“%% 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和代码,很难说你的问题是什么,但希望这可以帮助你更好地理解机制。

要允许从资源中使用格式化的string的应用程序,您应该更正您的XML。 所以,例如

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

应该换成

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

你可以看到这个细节。

您可以使用%% for xmlparsing器转义%,但在设备中显示两次。

为了显示一次尝试使用这种格式\ %%例如

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

在装置中显示为脂肪燃烧(50%至60%)

使用

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

要得到

80% wins作为格式化的string80% wins

我使用String.format()方法来获取插入的数字,而不是%d

在你的strings.xml文件中,你可以使用任何你想要的Unicode符号。

例如,百分号的Unicode编号是0025:

 <string name="percent_sign">&#x0025;</string> 

您可以在这里看到全面的Unicode标志列表

这可能是IDE变得太严格了。

这个想法是合理的,一般来说,你应该指定replacevariables的顺序,这样,如果你添加另一种语言的资源,你的java代码将不需要改变。 但是有两个问题:

首先,一个string如:

 You will need %.5G %s 

将被用作您将需要2.1200毫克将具有相同的顺序在任何语言的质量总是以科学的顺序总是表示。

第二种方法是,如果将variables的顺序置于任何语言中,则默认资源以(例如英文)指定,那么只需在资源string中指定语言的位置,使用与默认语言不同的顺序。

好消息是,这很容易解决。 即使不需要指定位置,IDE过于严格,只要指定它们即可。 对于上面的例子使用:

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

你可以用%%在xml中转义%,但是你需要在代码中设置文本,而不是在layout xml中。

不完全是你的问题,但类似的问题。

如果您的string条目中有多个格式,则不应多次使用“%s”。

别 :

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

DO:

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

试试这个(右):

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

一个棘手的方法:使用小百分号如下

  <string name="zone_50">Fat Burning (50&#65130; to 60&#65130;)</string> 

在维基百科的百分号

为了逃避百分比符号,你只需要%%

例如 :

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

返回“10%”

根据谷歌官方文档,使用%1 $ s和%2 $ s http://developer.android.com/guide/topics/resources/string-resource.html#FormattingAndStyling

你好,%1 $ s! 你有%2 $ d条新消息。

假设您想要显示(50%OFF),并在运行时input50。 这里是代码:

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

尝试在它前面使用反斜杠,如下所示:

 \%