相信 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 的用法远没有很多人想的那么简单,这里也算是抛砖迎玉一下,如果大家想要了解更详细的用法,可以参考官方文档。:   )

【转载】不可不知的 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. CICD-Jenkins笔记2014-2018

    CICD-Jenkins笔记2014-2018 20141119 chenxin 20180726 chenxin update 四个环境,开发/测试/预发布/生产. 文中涉及的最新脚本,请查看西部战 ...

  2. 【分享】Jenkins自动化部署全套视频教程

    1.课件 见博客:在线课件 2.教程列表 课程概况:该课程共8节,时长约80分钟. 建议学习方式:你可以在上班的路上或中午休息的时候,将视频调到1.5的观看速度,视频全部看完后,在按照课件操作. 3. ...

  3. 流程控制语句if基本概述

    目录 1. 流程控制语句if基本概述 2. 流程控制语句if文件比较 判断文件是否存在,返回方式 使用变量的方法进行判断 请输入你要备份的数据库名称: wordpress 请输入你要备份的数据库密码: ...

  4. Checklist for an RMAN Restore (Doc ID 1554636.1)

    Checklist for an RMAN Restore (Doc ID 1554636.1) APPLIES TO: Oracle Database - Enterprise Edition - ...

  5. QPNP 8909 8916 充电相关(2)【转】

    上一篇主要讲电池相关的一些知识,上节忘记讲了,电池一般分为电量计电池和非电流计电池,电量计电池,就不需要用pmu8916的IC,当然这只是只,不需要BMS来计算soc,而jni层也需要读取电流计的电池 ...

  6. 使用sessionStorage获取值和设置值

    <body><button id="btn1">设置值</button><button id="btn2">获取 ...

  7. 【转】C++ - 结构体构造函数使用总结

    声明 转载自:https://www.cnblogs.com/wlw-x/p/11566191.html 关于结构体构造函数使用总结 三种结构体初始化方法 1.利用结构体自带的默认构造函数 2.利用带 ...

  8. JavaScript基础2

    本节内容: 1:ECMA对象 2:string对象 3:Array对象 4:BOM对象 5:DOM对象之节点 6:DOM对象之EVENT事件 7:DOM节点的增删改查 8: 实例练习 http://w ...

  9. maven clean插件使用进阶

    maven clean插件使用进阶 参考 Maven clean 插件 Maven删除外部文件 查看命令帮助 mvn clean:help mvn clean:help -Ddetail=true - ...

  10. CSP2019 S2滚粗记

    最好分数:100+20+10+64+64+55 最坏分数:100+20+10+64+36+55 咕咕数据分数:100+25+10+64+60+55 CCF官方: 100+35+10+64+36+55= ...