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

不要复用

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

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

<string name="loading">Loading...</string>

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

<string name="sign_in_loading">正在登录...</string>
<string name="sign_up_loading">正在注册...</string>

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

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

良好的文件结构

<!-- register start -->
<string name="register_username">用户名</string>
<string name="register_password">密码</string>
<!-- register end --> <!-- login start -->
<string name="login_username">用户名</string>
<string name="login_password">密码</string>
<!-- login end -->

千万不要对此觉得麻烦,使用这样的方式来组织 strings.xml 文件,在应用变得复杂后,还能够很简单的通过搜索甚至观察的方式来找出你想要修改的字符串。

格式化

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

这个时候就可以考虑使用字符串格式化了:

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

%1\(s 代表了会格式化的字符串,%2\)d 代表了会格式化的数值并在第二的位置,大家可以以此类推。

// Java 代码:
Resources res = getResources();
String text = String.format(res.getString(R.string.welcome_messages), username, mailCount); // 注意参数的顺序。

复数名词

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

<!-- strings.xml start -->
<string name="book">book</string>
<string name="books">books</string>
<!-- strings.xml end --> if (bookCount == 0) {
text = getString(R.string.book);
} else {
text = getString(R.string.books);
}

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

<plurals name="book">
<item name="one">book</item>
<item name="others">books</item>
</plurals> int bookCount = 4;
Resources res = getResources();
String bookCount = res.getQuantityString(R.plurals.book, bookCount);
// result: books.

当然 Quantity String 不仅支持 one,还支持 zero, two, few, many 和 other。

可以自由决定各自情况下,使用什么词语(当然,在中文环境下可能用处并不大)。

并且 Quantity String 也能和上面提到的格式化搭配使用:

<plurals name="book">
<item name="one">%d book found.</item>
<item name="others">%d books found.</item>
</plurals> int count = 4;
Resources res = getResources();
String bookCount = res.getQuantityString(R.plurals.book, count, count);
// result: 4 books found.

谷歌官方建议,作为一个开发者至少应该给名词提供 'one' 和 'other' 属性。

文本高亮

大家可能知道用 ForegroundColorSpan 或 SpannableStringBuilder 能够高亮一段文本中的某些内容,但这对于多语言应用来说可能并不是最好的方式,因为这两个方法都要依靠待高亮文字的具体位置作为参数。如果应用需要支持的语言多了之后,这就会写大量的 Java 代码,和频繁计算待高亮内容位置。

这个时候就可以试试用 HTML:

<string name="html_text" formatted="false">
<![CDATA[
<font color=\'#28b5f5\'>Hello</font> world.
]]>
</string> TextView tv = (TextView) findViewById(R.id.tv_txt);
tv.setText(Html.fromHtml(getString(R.string.html_text)));

这其实也是格式化的一种,我们不仅能定义颜色,还可以使用 < b >、< i >、< u > 来分别使字符串具有加粗斜体下划线

其实 strings.xml 的用法远没有很多人想的那么简单,这里也算是抛砖迎玉一下,如果大家想要了解更详细的用法,可以参考官方文档。: )

作者:Hevin - 极光

原文:不可不知的 Android strings.xml 那些事

知乎专栏:极光日报

不可不知的 Android strings.xml 那些事的更多相关文章

  1. 【转载】不可不知的 Android strings.xml 那些事

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

  2. Android Strings.xml To CSV / Excel互转

    Android Strings.xml To CSV/Excel互转https://blog.csdn.net/hzxpyjq/article/details/50686983https://blog ...

  3. android strings.xml转义字符, 注意细节解决(转)

    XML转义字符 以下为XML标志符的数字和字符串转义符 "     (" 或 ") '     (' 或 &apos;) &     (& 或 & ...

  4. (转载)ANDROID STRINGS.XML 中的特殊字符转义

    今天项目碰到个转义特殊字符的问题,网上搜索看到,故转载,已标明出处: 项目中要在string.xml 中显示特殊符号.如@号冒号等.直接写肯定不行啦 只能考虑使用ASCII码进行显示.在XML中空格符 ...

  5. Android strings.xml中定义字符串显示空格

    <string name="str">字 符 串</string> 其中   就表示空格.如果直接在里面键入空格,无论多少空格都只会显示一个. 用的XML转 ...

  6. android strings.xml 报 is not translated in af,

    57 down vote In your ADT go to window->Preferences->Android->Lint Error Checking Find there ...

  7. 修改Android中strings.xml文件, 动态改变数据

    有些朋友可能会动态的修改Android中strings.xml文件中的值,在这里给大家推荐一种简单的方法.strings.xml中节点是支持占位符的,如下所示: <string name=&qu ...

  8. 【我的Android进阶之旅】解决strings.xml格式化占位符错误: Multiple substitutions specified in non-positional format

    今天有一个Android新手使用strings.xml进行格式化的时候报了占位符错误, Multiple substitutions specified in non-positional forma ...

  9. 关于Android中res目录strings.xml文件中的转义字符之笔录

    res目录strings.xml文件中的转义字符:         ------------------>     代表着一个汉字的位置:                        ---- ...

随机推荐

  1. CSS3弹性盒模型新版和老版写法差异

    1.在使用弹性盒模型的时候父元素必须要加display:box 或 display:inline-box: 新版弹性盒模型:flex:display : flex 老版弹性盒模型:box : disp ...

  2. GitHub客户端Desktop的安装和使用总结

    前言 这段时间想把我写的东西上传到GitHub上,所以开始收集资料学习,走了很多弯路( msysgit和极慢的FQ网速让我欲仙欲死),最后找到了比较好用的工具GitHub Desktop.在此做出自己 ...

  3. Google addword 策略

    https://support.google.com/adwords/answer/1704392?hl=zh-Hans&authuser=0 顾客会用自己的思路去解决生意上的问题,想要拥有自 ...

  4. 第十八篇 js高级知识---作用域链

    一直有想法去写写js方面的东西,我个人是最喜欢js这门语言,喜欢的他的自由和强大,虽然作为脚本语言有很多限制的地方,但也不失为一个好的语言,尤其是在H5出现之后.下面开始说说js的方面的东西,由于自己 ...

  5. 【struts2】ActionContext与ServletActionContext

    1 再探ActionContext 我们知道,ActionContext是Action执行时的上下文,里面存放着Action在执行时需要用到的对象,也称之为广义值栈.Struts2在每次执行Actio ...

  6. 如何用好消息推送为app拉新、留存、促活

    作为移动端APP产品运营最重要的运营手段,JPush消息推送被越来越多的APP厂商所重视,在信息泛滥的移动互联网时代,手机APP应用安装得越来越多,小小的手机屏幕每天收到的消息推送也越来越多,站在用户 ...

  7. Bean复制

    有的时候我们需要将一个bean的属性赋值到另一个bean的属性中,比如用户提交过来的表单bean需要将该bean中的属性值赋值到对应的数据库bean,我们通常会以这样的方式做: User user = ...

  8. php写购物车(思路&源码)

    本文介绍一个php实现的购物车代码,功能实现完整,具有一定的参考价值 这里我们为你提供个简单的php购物车代码,从增加购物产品与发生购买了,在商城开发中,这个功能是少不了的 具体分析如下: 对购物车里 ...

  9. Spring-boot 最小demo

    POM 文件,注意红色部分: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http: ...

  10. ORM-Dapper学习<二>

    Dapper的简介 Dapper是.NET下一个micro的ORM,它和Entity Framework或Nhibnate不同,属于轻量级的,并且是半自动的.Dapper只有一个代码文件,完全开源,你 ...