不可不知的 Android strings.xml 那些事

4,207 阅读3分钟
原文链接: www.jianshu.com

相信 strings.xml 已经是大家在 Android 开发中最熟悉的文件之一了,但其实它也有很多需要注意的地方和一些小技巧,知道了这些可以让你的 Android 应用更加规范易用,大家来看看吧。: )

不要复用

不要在不同的界面中复用相同的字符串。

这一条可能很多人会有不同的意见,因为广为流行的编程理念就在教导我们要复用代码,当然代码复用是很好的理念,可以让程序更加简洁。但也容易形成什么都想复用的思维惯性,而这在某些场景下就可能会造成麻烦。

比如,想象下你在应用中的登录和注册界面中都是用了相同的字符串 - R.string.loading.

Loading...

之后如果产品需求变更,要分别使用不同的提示语,那就不得不新创建两个 string 并在代码中配置它们。所以如果从一开始就为不同页面分别配置,那需要做的就仅仅是修改下 strings.xml 文件。

正在登录...
正在注册...

更容易忽略的一个原因是,如果你们的应用不想只是面对国内用户,还要面对其他语系的用户的话,有些语言可能会造成意想不到的问题。

因为一些语言同样一个意思在不同的语境下,会用到不同的单词,个中滋味经历过的自然会懂。

良好的文件结构

使用区分不同界面的前缀和注释来分隔文件。


res/values/strings.xml

  • 每一个 string 添加一个区分界面的前缀可以让你马上辨别出当前字符串是用在哪个界面的。
  • 清晰的 strings.xml 文件结构可以帮助你快速的定位和修改文件,当应用复杂之后这会显得格外重要。

格式化

用 getString(int id, Object... formatArgs) 方法来格式化字符串。

千万不要使用字符串拼接的方法,因为不同语言的句子顺序是多样的,字符串拼接会让你的逻辑非常复杂。

正确的做法应该是:首先在 strings.xml 文件中进行定义,%s 代表了会变动的部分。

%s 欢迎回来

Java 代码:

String username = "Hevin";
String welcome = getString(R.string.login_welcome_back, username);
// result: Hevin 欢迎回来

复数名词

使用 getQuantityString(int id, int quantity) 来处理复数名词。

不要像下面这样在你的 Java 代码中处理单词复数问题,因为不同的语言针对复数会有不同的语法规则。


minute
minutes


String text;
int minutes = Calendar.getInstance().get(Calendar.MINUTE);
if (minutes == 0) {
    text = getString(R.string.minute);
} else {
    text = getString(R.string.minutes);
}

正确的做法应该是使用 getQuantityString(int id, int quantity) 方法。



    minute
    minutes



int minutes = Calendar.getInstance().get(Calendar.MINUTE);
String text = getResources().getQuantityString(R.plurals.minutes, minutes);

文本高亮

使用 html 文本来高亮本文。

使用 ForegroundColorSpan 来高亮一段文本中的某些内容,并不总是最好的解决方法。因为其要依靠 indexes(文字所在的位置),所以对于多语言 App 来说并不方便。

这个时候可以试试下面的方法:


Discover and  play  games.    
]]>

Java:

TextView tv = (TextView) findViewById(R.id.tv_txt);
tv.setText(Html.fromHtml(getString(R.string.html_text)));

实际效果