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

相信 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>

%1s代表了会格式化的字符串,s代表了会格式化的字符串,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 那些事
知乎专栏:极光日报

posted on 2017-05-15 16:33 叶祖辉 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/yezuhui/p/6857050.html

不可不知的 Android strings.xml 那些事相关推荐

  1. android xml 画下划线,android – strings.xml:如何从标记前面的空格中删除下划线?...

    我的strings.xml中有以下行: This is a test 在我的活动xml中,我在TextView中引用了这个字符串: android:layout_width="wrap_co ...

  2. 【Android】android strings.xml转义字符

    这些特殊字符使用的时候很纠结. android:text   设置这个属性时会报错 "        (" 或 ")  '         (' 或 ') &   ...

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

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

  4. Android 字符串资源(strings.xml)

    文章目录 基础使用 1. String 2. String Array 进阶使用 1. 特殊字符转义 2. 设置字符串格式 3. 使用HTML标记设置样式 4. 使用注解设置样式 注意事项❗❗❗ 1. ...

  5. Android --- 快速将字符串定义到strings.xml文件的方法

    前言 作为Android开发来说,为了预防乱码和方便后期国际化扩展,将代码或者布局中的字符串定义到strings.xml文件中是很有必要的.这也是编程的一个良好习惯. 操作方法 如下图:先将字符串定义 ...

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

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

  7. Android Studio翻译strings.xml为多国语言

    前言 做完android app后需要做多国语言支持怎么办?通过百度或GOOGLE翻译一个个操作是不切实际的. 参考过AndroidLocalizationer,发现需要申请KEY,太麻烦.继续找,发 ...

  8. Android的strings.xml多语言翻译

    Android的strings.xml多语言翻译 之前尝试过使用Android studio上的翻译插件进行翻译,翻译的结果可想而知,简直太慢了,所以打算直接搞个外部翻译xml文件,再将翻译好的文件重 ...

  9. 使用Python调用baidu翻译的接口,实现转换android stuido 中的values/strings.xml 解放生产力,自动翻译生成文件

    调用baidu翻译的接口,实现转换android stuido 中的values/strings.xml 解放生产力,自动翻译生成文件 因为使用的是合法免费的接口,每秒只能请求一次,测试结果翻译330 ...

最新文章

  1. 从零使用qemu模拟器搭建arm执行环境
  2. 阿里研究员:缩短软件开发中的反馈弧
  3. ai/ml_您本周应阅读的有趣的AI / ML文章(8月9日)
  4. Android清除本地数据缓存代码
  5. Python 爬虫 —— BeautifulSoup
  6. 环,模,补码,负数的表示与减法实现
  7. 流放之路进传送门显示服务器断线,资讯:特别改动 优化组队经验获取 降低断图风险...
  8. argparse及logging的相关用法
  9. Flex与Servlet之间数据的交互
  10. Makefile,Shell command,Shell Language 之间的联系
  11. win10系统使用自带的win7图片查看器
  12. python老鼠书和蛇鼠_哪种编程语言更好?抓到‘老鼠’就是‘好猫’
  13. 价格便宜一半 这款智能座舱芯片实际性能却超越高通8155?
  14. 9.PS-强大的画笔工具
  15. Hazelcast源码剖析之Eviction
  16. 1.1 卡牌对象的创建———自制卡牌游戏之旅
  17. 用百度搜索SB,为什么是google排第一?
  18. scrapy案例:爬取京东笔记本数据
  19. 【专辑下载】Hillsong 所有专辑列表
  20. 【原生JS】写滚动指定位置展示动画

热门文章

  1. css之多行文本输出
  2. Vue.js视频教程
  3. 利用反射打印对象一般成员属性值
  4. 【jQuery Demo】jQuery打造动态下滑菜单
  5. 如何设置cout的输出格式(转)
  6. 转贴一篇不错的Python入门教程 - Instant Hacking[译文]
  7. java如何获取tree_如何从javac插件获取memberselecttree中的表达式类型?
  8. python绘制国际象棋_python使用turtle绘制国际象棋棋盘
  9. python天气数据分析可视化_python可视化爬虫界面之天气查询
  10. usb设备的probe全过程