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

作者:Hevin丶 时间:2022-06-04 00:14:05 

strings.xml 有很多需要注意的地方和一些小技巧,知道了这些可以让你的 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
0
投稿

猜你喜欢

  • SpringBoot定时任务设计之时间轮案例原理详解

    2023-04-24 00:48:36
  • SSM框架中测试单元的使用 spring整合Junit过程详解

    2022-07-01 14:46:48
  • Unity2021发布WebGL与网页交互问题的解决

    2023-01-27 23:44:17
  • Java实现在线SQL编程最新完整版

    2022-04-12 01:03:45
  • Java的关键字与保留字小结

    2021-05-30 10:20:50
  • springBoot解决static和@Component遇到的bug

    2022-12-31 01:23:27
  • C#子类对基类方法的继承、重写与隐藏详解

    2023-01-31 04:48:46
  • Flutter开发Mac桌面应用实现自动提取生成视频字幕文件

    2023-05-11 05:25:58
  • SpringBoot整合阿里 Druid 数据源的实例详解

    2021-07-28 17:50:32
  • springmvc+mybatis 做分页sql 语句实例代码

    2021-09-11 19:29:06
  • Unity3D实现人物转向与移动

    2022-10-28 08:42:13
  • Android编程解析XML文件的方法详解【基于XmlPullParser】

    2022-09-21 22:48:40
  • Java实现替换PDF中的字体功能

    2023-10-04 13:24:17
  • 浅析Java中Split函数的用法技巧

    2023-02-19 09:13:27
  • 解决Spring国际化文案占位符失效问题的方法

    2022-10-20 23:42:23
  • Java代码精简之道(推荐)

    2023-07-28 02:00:05
  • 基于C#实现语音识别功能详解

    2023-07-12 18:55:24
  • Java8 使用工厂方法supplyAsync创建CompletableFuture实例

    2023-02-14 03:57:22
  • Java网络编程TCP实现文件上传功能

    2023-01-02 00:00:27
  • 在Android模拟器上模拟GPS功能总是null的解决方法

    2023-09-16 16:51:15
  • asp之家 软件编程 m.aspxhome.com