android 百分号,Android XML百分比符号

Android XML百分比符号

我有一个字符串数组,其中使用了%符号。 使用%的正确格式是%.当我在该阵列中有一个带有多个%的字符串时,它会给我这个错误。

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 where is expected

zaid asked 2019-02-14T12:24:04Z

14个解决方案

424 votes

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

以下是一些如何在资源字符串中包含%-symbol的想法。

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

%a + %a == 2%a

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

如果省略Formatter属性,则该字符串将用作格式字符串,您必须转义%-symbols。 这是用double-%正确完成的:

%%a + %%a == 2%%a

现在Formatter给你没有错误但是根据你如何使用它,如果在没有任何格式参数的情况下调用Formatter,结果字符串可以是“%% 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和代码,很难说出你的问题到底是什么,但希望这有助于你更好地理解机制。

Josef Pfleger answered 2019-02-14T12:25:01Z

150 votes

要允许应用程序使用来自资源的格式化字符串,您应该更正xml。 所以,例如

Your App name, ver.%d

应该换成

Your App name, ver.%1$d

你可以看到这个细节。

Paul E. answered 2019-02-14T12:25:42Z

47 votes

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

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

例如

Fat Burning (50\%% to 60\%%)

显示为Fat Burning (50% to 60%)在设备中

pavblazek answered 2019-02-14T12:26:31Z

26 votes

使用

String.format()

要得到

String.format()作为格式化字符串。

我正在使用String.format()方法来插入数字,而不是%d。

ViliusK answered 2019-02-14T12:27:19Z

9 votes

在strings.xml文件中,您可以使用任何所需的Unicode符号。

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

%

您可以在此处查看完整的Unicode标志列表

Asaf Pinhassi answered 2019-02-14T12:28:01Z

7 votes

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

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

别 :

Planned time %s - %s (%s)

做:

Planned time %1$s - %2$s (%3$s)

Garytech answered 2019-02-14T12:28:53Z

5 votes

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

Mee answered 2019-02-14T12:29:24Z

5 votes

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

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

首先,字符串如:

You will need %.5G %s

使用,你将需要2.1200毫克将使任何语言的顺序相同,因为质量总是科学地按顺序表示。

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

好消息是这很容易解决。 尽管不需要指定位置,并且IDE过于严格,但无论如何都要指定它们。 对于上面的例子,使用:

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

Steve Waring answered 2019-02-14T12:30:41Z

5 votes

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

例如 :

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

返回“10%”

landerlyoung answered 2019-02-14T12:31:28Z

3 votes

试试这个(右):

Great application %s ☞ %s ☞ %s \\n\\nGo to download this application %s

sonida answered 2019-02-14T12:31:59Z

3 votes

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

Fat Burning (50﹪ to 60﹪)

维基百科上的百分号

Bao Le answered 2019-02-14T12:32:36Z

1 votes

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

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

techtinkerer answered 2019-02-14T12:33:14Z

-1 votes

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

(

%1$s

%2$s

OFF)

在java类中使用以下代码:

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

holder1.mTextViewDiscount.setText(formattedString);

Harish Rana answered 2019-02-14T12:33:51Z

-14 votes

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

\%

lolraccoon answered 2019-02-14T12:34:19Z

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值