现象:
在开发时,想动态引用含占位符的字符串,发现有红色波浪线警告,项目可以正常运行,既然是警告,肯定就是我们代码有问题。
将鼠标放上去提示警告:
Format string 'xxx' is not a valid format string so it should not be passed to String.format
大意是字符串“xxx”不是有效的格式字符串,不能使用format转型。
系统给出的建议是添加如下代码,及忽略对应的警告:
@SuppressLint("StringFormatMatches")
@SuppressLint("StringFormatInvalid")
既然是警告,肯定是我们哪里写的不规范或者代码是失效的。
解决方案:
仔细检查string中的书写是否准确,多语言是否所有语言都写了占位符。
经过排查发现,原来是多语言使用字符串占位符时,其中一个语言没有使用占位符,于是studio提出了警告,给对应语言添加占位符后,红色波浪线的警告消失了。
占位符
我们常用的占位符有:%s、%d、%1$ s、%2$ d(中间没空格,不显示$ ,所以加了空格)
%1$ s表示把第一个位置的占位符替换成string类型
%2$ d表示把第二个位置的占位符替换成int类型
%s 表示把此位置的占位符替换成string类型
%d 表示把此位置的占位符替换成int类型
直接看代码实例:
<string name="format_content">%s 来自中国</string>
调用:
getString(R.string.format_content, "zhangsan");
输出:zhangsan 来自中国
<string name="format_content_2">%s 是 %s 的 %s ,他们一共 %d 人,他们都是来自 %s </string>
调用:
getString(R.string.format_content_2, "张三", "李四", "好朋友", 3, "上海");
输出:张三 是 李四 的 好朋友 ,他们一共 3 人,他们都是来自 上海
<string name="format_content_3">%1$s 是 %2$s 的 %3$s ,他们一共 %4$d 人,他们都是来自 %5$s </string>
调用:
getString(R.string.format_content_3, "张三", "李四", "好朋友", 3, "上海");
输出:张三 是 李四 的 好朋友 ,他们一共 3 人,他们都是来自 上海
<string name="format_content_4">%1$s 是 %1$s 的 %1$s ,他们一共 %4$d 人,他们都是来自 %5$s </string>
调用:
getString(R.string.format_content_4, "张三", "李四", "好朋友", 4, "上海");
输出:张三 是 张三 的 张三 ,他们一共 4 人,他们都是来自 上海