前言
今天在解决项目中的Warn的时候,发现string.xml里面出现了几个有意思的警告,所以分享给各位有强迫症的程序猿们。Warn信息如下
<1> Replace "..." with ellipsis character (…, &&;#8230;) ? <2> 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
警告<1>
我在string.xml中的使用是<string name="load_tip">正在加载中...</string>,提示信息为Replace "..." with ellipsis character (…, &&;#8230;) ?,也就是需要我们将...替换为后面的一个字符,不过个人尝试了下,解决办法是将...替换为Unicode表示,也就是<string name="load_tip">正在加载中\u2026</string>关于编码方式的区别可以查看字符编码这篇博客。同样的,对于其他一些特殊的符号,比如"°",在xml文件中使用的时候最好也是使用Unicode形式表示,也就是\u00B0
警告<2>
对于警告二是由于项目需要适配多语言环境,比如对于中国,时间显示为2017年01月01日,在英文下肯定不能这样显示了,所以将时间格式写在xml文件中,这样就可以根据语言的不同显示不同的格式了。
最初的想法是在xml中使用
<string name="time_format">%d年%02d月%02d日</string>
然后在代码中使用如下代码。
Calendar calendar = Calendar.getInstance(); int year = calendar.get(Calendar.YEAR); int month = calendar.get(Calendar.MONTH) + 1; int day = calendar.get(Calendar.DAY_OF_MONTH); String time_format = getResources().getString(R.string.time_format); String timeStr = String.format(time_format,year, month, day)
没想到出现了警告<2>,反复检查后发现是string.xml中的 % 导致编译失败,只要将上面的%d换成%1$d就行了,如果有多个,就依次为%1$d、%2$d、%3$d。
额外,如果你想%出现在字符串中,可以使用转义字符,也就是%%,或者使用<string name="test" formatted="false">% test %</string>即可。
其他
xml格式默认将标签开头和结尾的空格给省略,如下
<string name="unknow_radio_detail"> 暂无视频详情</string>
会被解析成没有空格的形式,相当于被系统执行了一次trim操作。如果需要空格则应该为下面的形式:
<string name="unknow_radio_detail">    暂无视频详情</string>
规则就一点:在string.xml中,如果需要特殊字符,一般使用Unicode形式即可
参考博客:找骨头的啊呜