ChatGPT解决这个技术问题 Extra ChatGPT

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 </item> where </string-array> is expected
您可以发布导致此错误的 XML 吗?如果没有看到问题的原因,就很难确定问题。
这是一个很容易被任何带有 2 个或更多 % 符号的字符串复制的错误。
如果不是为了格式化目的,最好用 way 来完成。
就我而言,我错误地将格式参数输入为 1%$s,而不是 %1$s。

J
Josef Pfleger

Android 资产打包工具 (aapt) 已成为 very strict in its latest release,现在用于所有 Android 版本。您收到的 aapt-error 已生成,因为它不再允许 non-positional format specifiers

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

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

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

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

如果您省略 formatted="false" 属性,则该字符串将用作格式字符串,并且您必须转义 % 符号。这是用双%正确完成的:

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

现在 aapt 不会给您任何错误,但取决于您如何使用它,如果调用 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 和代码,很难说出您的问题到底是什么,但希望这可以帮助您更好地理解这些机制。


我选择了这个作为答案,因为它应该可以工作,但显然我遇到了一个错误,我遇到了那个字符串,所以我决定使用 %% 和 "XXX.replaceAll("%%", "%");"
使用 formatted=false 效果很好。这就是我使用它的方式:\'Sweet\' 10% 到 20% 甚至 35% 的糖(按重量计)
formatted=false 对我也很有效。使用 %%,它实际上在我的设备和模拟器上显示为 %%..
formatted=false 过去对我来说效果很好。现在 (ADT 22) ,由于某种原因它没有。如果我使用:“str=mContext.getString(R.string.str,"hello")”,它将有这个 lint 警告:“格式字符串 'str' 不是有效的格式字符串,因此不应将其传递给字符串.格式"
如果您从 访问,则打印百分比使用 \u0025。这对我有用。
P
Paul E.

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

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

应该替换为

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

您可以查看 this 了解详细信息。


谢谢,您提供了缺少的链接 - 从字面上看。
对于多个参数替换(例如使用字符串),请使用 %1$s%2$s 等。
谁会为这个小东西阅读这么大的答案?谢谢,我向下滚动找到你。
M
Mostafa Arian Nejad

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

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

例如

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

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


\%% 导致 Nexus 4 4.2.1 崩溃。没有测试过其他人。
当您已经知道要包含在字符串中的百分比时,这很好用并且很容易,而不是使用字符串格式化程序并且总是必须以编程方式设置这些硬编码值。
这对我来说在 Nexus 5.1.1 上也崩溃了。 @ViliusK 答案是正确的。
只需使用 %% 而不是 %
V
ViliusK

利用

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

要得到

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

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


l
landerlyoung

要转义百分号,您只需要 %%

例如 :

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

返回“10%”


您的答案与其他几个现有答案几乎相同
... 错误,因为返回 10% 而不是 %10。 FIY:当您使用 String.format 时,您应该每次都指定区域设置。当您不放置语言环境并使用阿拉伯语语言环境作为格式数字时,您会感到非常惊讶......
A
Asaf Pinhassi

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

例如,百分号的 Unicode 数字是 0025:

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

您可以查看 Unicode 符号的完整列表 here


这没有任何意义。 %和 % 在 xml 文件中是相同的。
资源文件被转换为 Java 资源,在此过程中,% 字符返回。恐怕这并不能解决问题。
G
Garytech

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

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

不 :

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

做 :

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

M
Mee

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


是的,它确实以 double % 转义,并且编译得很好。但是当在模拟器甚至设备上运行时,它可能会显示为 %%。
B
Bao Le

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

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

Percent Sign on Wikipedia


S
Steve Waring

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

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

首先,一个字符串,例如:

You will need %.5G %s

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

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

好消息是这很容易解决。即使不需要指定位置,而且 IDE 过于严格,但还是要指定它们。对于上面的示例,请使用:

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


D
Dave Clemmer

试试这个(右):

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

t
techtinkerer

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

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


H
Harish Rana

假设您要显示 (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);

l
lolraccoon

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

\%

此解决方案导致崩溃。

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅