Android 开发中应该知道的关于strings.xml的事
避免过度复用
不要复用不同页面上的字符串
1.假设你现在在Sign In与Sign Up两个界面上都设置了一个加载提示框,因为两个都是用于提示正在加载中的,因此你打算使用相同的提示语 —— R.string.loading
<string name="loading">Loading please wait…</string>
不过后来PM说这样实在太不友好了,因此你打算用两个更具体点的提示语来代替,于是你你将你的strings.xml
修改成了下面这样
<string name="sin_in_loading">Signing in…</string>
<string name="sin_up_loading">Signing up…</string>
合理分割
对于相同页面中的字符串以前缀与注释分割
1.添加前缀到字符串上有助于辅助快速地识别字符串是属于哪个页面的。
2.清晰的字符串的区分也有助于未来对国际化的支持,可以按照页面来逐个地进行多语言支持。
Format
使用
Resources#getString(int id, Object...formatArgs)
来格式化字符串
尽量避免使用+
来连接字符串,因为在不同的语言里对于词汇的划分是不一致的。
<string name="login_welcome_back">- welcome back</string>
String username="Xxx Xxx";
String result=username+" "+getString(R.string.login_welcome_back);
//result "Xxx Xxx - welcome back"
正确的方法是使用Resources#getString(int id, Object… formatArgs).
<string name="login_welcome_back">%s - welcome back</string>
String username="Xxx Xxx";
String result=getString(R.string.login_welcome_back,username);
//result "Xxx Xxx - welcome back"
Plurals:复数处理
使用Resources#getQuantityString (int id, int quantity)来处理复数字符串
尽量不要在Java代码中判断是否需要使用复数表述,同样是因为不同的语言对于复数表述的文法规则是不一样的。
<string name="minute">minute</string>
<string name="minutes">minutes</string>
String text;
int minutes = Calender.getInstance().get(Calender.MINUTE);
if(minutes == 0){
text = getString(R.string.minute);
}else{
text = getString(R.string.minutes);
}
正确的方法是使用Resources#getQuantityString (int id, int quantity)
来进行处理
<plurals name="minutes">
<item quantity="one">minute</item>
<item quantity="other">minutes</item>
</plurals>
int minutes = Calender.getInstance().get(Calender.MINUTE);
String text=getResources().getQuantityString(R.plurals.minutes,minutes);
Words highlighting:单词高亮
使用HTML文法规范来进行单词高亮
如果我们希望在TextView
中修改一些单次的颜色,可能ForegroundColorSpan
不一定是最佳的选择,同样是因为基于下标的高亮策略可能在不同的语言中出现问题。最好的呢,也还是使用HTML的字体颜色标签进行控制,譬如你希望在Discover and play games
这一段话中需要将Discover
与play
进行高亮展示:
<string name="html_text" formatted="false">
<![CDATA][<font color=\'#28b5f5\'>Discover</font> and <font color=\'#28b5f5\'>play</font> games.]
</string>