相信 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. Mybatis+Spring框架整合

    1.整合思路 1.SqlSessionFactory对象应该放到spring容器中作为单例存在. 2.传统dao的开发方式中,应该从spring容器中获得sqlsession对象. 3.Mapper代 ...

  2. 关于C# webapi ,接口返回字符串和json格式 ,返回值中有反斜杠

    最近遇到一个比较郁闷的问题,记录一下 写了一个接口,想返回json 数据,但是返回值中总是带有反斜杠... ,下面来看原因 首先,配置 webapi的路由 App_Start 文件夹下 ,WebApi ...

  3. 设计院老师良心汇总:值得牢记的15个CAD基础技巧,能帮大忙

    哈喽!你们的CAD魔鬼(老师)来喽! 良心CAD技巧汇总,设计院师傅精心汇总,值得你牢记的15个CAD基础技巧,满满的都是干货,日常最常见的问题以及解决方法这里都汇总给你,给你高效的绘图体验,关键时刻 ...

  4. 【Angular】父组件监听子组件事件(传参)

    Angular官方文档Demo地址:>component-interaction#parent-listens-for-child-event 举一个自己在写的项目

  5. mysql定时任务(event事件)

    1.事件简介 事件(event)是MySQL在相应的时刻调用的过程式数据库对象.一个事件可调用一次,也可周期性的启动,它由一个特定的线程来管理的,也就是所谓的“事件调度器”. 事件和触发器类似,都是在 ...

  6. iOS中计算字符串NSString的高度

    根据固定宽度计算字符串高度: NSString *info = @"但是公司的高度是广东省公司的广东省高速度来开个大帅哥多撒谎个爱好就跟他说噶三公司噶是的刚好是我哥如果黑暗如果坏都干撒降低公 ...

  7. 微信小程序获取input输入框内容

    1.wxml <input class="weui-input" type='number' bindinput="emailInput"/>   ...

  8. PHP代码篇(六)--如何根据邀请人id查询满足条件的会员上级

    说,如果有一个会员表,每一个会员都有一个邀请人from_id字段(记录该会员是谁邀请的),知道一个会员id,现在需要查询某一个会员是否是该会员的下级. 表如下: 一.当下需求 1.我们需要知道会员id ...

  9. Impala基于内存的SQL引擎的详细介绍

    一.简介 1.概述 Impala是Cloudera公司推出,提供对HDFS.Hbase数据的高性能.低延迟的交互式SQL查询功能. •基于Hive使用内存计算,兼顾数据仓库.具有实时.批处理.多并发等 ...

  10. go语言设计模式之template

    template.go package template import ( "strings" ) type MessageRetriever interface { Messag ...