Android工程编译出现Multiple substitutions specified in non-positional format错误的分析

转载 2012年03月26日 13:49:48

转自:http://be-evil.org/android-multiple-substitutions-specified-in-non-positional-format.html

我定义了如下字符串:

<string name="date_format">%d:%d %s</string>
show the following error:
Multiple annotations found at this line:
- error: Multiple substitutions specified in non-positional format; did you mean to add the formatted="false" 
 attribute?
- error: Unexpected end tag string
反复检查后发现是 %s 导致编译失败,

去Google的Android开发者讨论组查看关于这个问题的讨论 后看到了Xavier Ducrohet大神的回复,说这是由于新的SDK采用了新版本的aapt(Android项目编译器),这个版本的aapt编译起来会比老版本更加的严格,然后在Android最新的开发文档的描述String的部分,已经说明了 如何去设置 %s 等符号,下面是文档片段:

If you need to format your strings using String.format(String, Object...) , then you can do so by putting your format arguments in the string resource. For example, with the following resource:

如果你需要使用 String.format(String, Object...) 来格式化你的字符串,你可以把格式化参数放在你的字符串中,参见下面的例子:

<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>

In this example, the format string has two arguments: %1$s is a string and %2$d is a decimal number. You can format the string with arguements from your application like this:

在这个例子中,这个格式化的字符串有2个参数, %1$s是个字符串 %2$d 是个浮点数,你可以在你的程序中按照下面的方法来根据参数来格式化字符串:

Resources res = getResources();

String text = String.format(res.getString(R.string.welcome_messages), username, mailCount);

那么根据例子上说的我需要把%s换成%1$s才行了,修改后编译通过,程序成功启动。

问题补充:

有读者问如何在<string></string>中使用%号

有两个办法可供选择

1.用%%来表示1个%,和转意符号 \ 的用法相同
 
2.如果你的字符串不需要格式化,可以在你的<string 标签上增加一个属性:formatted="false"例如 <string name="test" formatted="false">% test %</string> 即可

最后稍微延伸一下这个格式化变化的原因: 大神Bob Kerns 觉得当前Java的格式化字符串方式可读性不好(我也有同感),然后就写了篇博文来提出他认为的最好的方式,

http://bobkerns.typepad.com/bob_kerns_thinking/2010/12/dear-java-better-text-formatting-please.html

显然,Android开发团队认可了他的建议

【我的Android进阶之旅】解决strings.xml格式化占位符错误: Multiple substitutions specified in non-positional format

今天有一个Android新手使用strings.xml进行格式化的时候报了占位符错误, Multiple substitutions specified in non-positional forma...

Android2.3 SDK编译出现Multiple substitutions specified in non-positional format的分析

Android2.3 SDK编译出现Multiple substitutions specified in non-positional format的分析 昨天谷歌正式放出了Android2.3,抱...

Android编译出现Multiple substitutions specified in non-positional format

前段时间更新了ADT和Android SDK 2.3,更新后发现自己2.2下编译的很好的项目出现了问题,错误详细内容为:Multiple annotations found at this line:...

Android编译时出现aapt.exe finished with non-zero exit value 1错误的解决方法

By Long Luo昨天在开发一个项目时,在Android Studio中编译时,gradle编译之后出现了如下错误:Error:Execution failed for task ':sample...

OpenCV4Android:non-system libraries in linker flags: -lopencv_java错误的解决

最近搞之前的一份老代码,发现OpenCV到2.4.11之后,之前的mk文件不适用了,报一堆一堆的错误。一是如前文所述,LOCAL_LDLIBS    += -lm -llog这一句+=绝不能错误的写成...

lib工程被引用的时候出现Unable to execute dex: Multiple dex files define。和classNoClassDefFoundError错误

最近在做项目的时候遇到如下的需求: 我们为A方,需要引用B方的jar包。我们开发sdk,之后将sdk以lib工程的形式提供给C方使用。 出现问题如下: 1、 Unable to execute dex...

从XCode添加File的错误Multiple errors occurred while copying the files分析Cocos2d-x在XCode工程中添加文件

1、Multiple errors occurred while copying the files问题 关于这个问题,这里有解决办法 大致的意思是 1)添加文件没有全部添加,但是有部分...

lib_clapack.a(dlasyf.o): could not read symbols: File in wrong format---- 交叉编译opencv2.0遇到的错误解决

首先下载opencv2.0的源码http://www.pudn.com/downloads471/sourcecode/graph/opencv/detail1972436.html,opencv从2...

non-virtual thunk for Virtual Function in multiple inheritance

转载自 http://thomas-sanchez.net/computer-sciences/2011/08/15/what-every-c-programmer-should-know-the-...

maven工程里编译运行main函数出错:“ You must specify a valid lifecycle phase or a goal in the format”

命令行编译Maven工程时碰到如下错误,先记录下解决方案: *********************************************************************...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android工程编译出现Multiple substitutions specified in non-positional format错误的分析
举报原因:
原因补充:

(最多只允许输入30个字)