warn: multiple substitutions specified in non-positional format; did you mean to add the formatted="false" attribute?

编辑`strings.xml`的时候

<string name="myurl">http://code.dd.com/rr?q=%rr.55</string>

或者

<string name="message_content'>恭喜您你获得%1s 积分,占比%2s %</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: Unexpected end tag string

出现这个错误的原因主要是因为`strings`字串中包含百分号`(%)`,

有几种方式解决

1.用两个百分号表示一个百分号即
<string name="myurl">http://code.dd.com/rr?q=%%rr.55</string>

<string name="message_content">恭喜您你获得%1s 积分,占比%2s %%</string>
2.用转义符表示
<string name="myurl">http://code.dd.com/rr?q=\%rr.55</string>
二:无需格式化

根据错误提示可知,如果字符串无需格式化,可在`<string>` 标签上增加属性:`formatted="false"`,即

<string name="myurl" formatted="false">http://code.dd.com/rr?q=%rr.55</string>
三:关于上面问题的延伸

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

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

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

Resources res = getResources();

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

目前`Android`的`SDK`已经支持直接格式化字符串,不需要使用`String.format(String, Object...) `,如下

Resources res = getResources();

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

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

参考链接