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

本文分享了关于Android开发中strings.xml文件使用的几个实用技巧,包括避免字符串复用、使用前缀提高文件结构清晰度、利用方法正确格式化字符串、处理复数名词以及使用HTML实现文本高亮。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

良好的文件结构

使用区分不同界面的前缀和注释来分隔文件。


res/values/strings.xml
  • 每一个 string 添加一个区分界面的前缀可以让你马上辨别出当前字符串是用在哪个界面的。
  • 清晰的 strings.xml 文件结构可以帮助你快速的定位和修改文件,当应用复杂之后这会显得格外重要。

格式化

用 getString(int id, Object... formatArgs) 方法来格式化字符串。

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

正确的做法应该是:首先在 strings.xml 文件中进行定义,%s 代表了会变动的部分。

<string name="login_welcome_back">%s 欢迎回来</string>

Java 代码:

String username = "Hevin";
String welcome = getString(R.string.login_welcome_back, username);
// result: Hevin 欢迎回来

复数名词

使用 getQuantityString(int id, int quantity) 来处理复数名词。

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

<!-- strings.xml start -->
<string name="minute">minute</string>
<string name="minutes">minutes</string>
<!-- strings.xml end -->

String text;
int minutes = Calendar.getInstance().get(Calendar.MINUTE);
if (minutes == 0) {
    text = getString(R.string.minute);
} else {
    text = getString(R.string.minutes);
}

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

<!-- strings.xml start -->
<plurals name="minutes">
    <item quantity="one">minute</item>
    <item quantity="other">minutes</item>
</plurals>
<!-- strings.xml end -->

int minutes = Calendar.getInstance().get(Calendar.MINUTE);
String text = getResources().getQuantityString(R.plurals.minutes, minutes);

文本高亮

使用 html 来高亮指定文本。

使用 ForegroundColorSpan 来高亮一段文本中的某些内容,并不总是最好的解决方法。因为其要依靠 indexes(文字所在的位置),所以对于多语言 App 来说并不方便。

这个时候可以试试下面的方法:

<string name="html_text" formatted="false">
<![CDATA[        
<font color=\'#28b5f5\'>Discover</font> and <font color=\'#28b5f5\'> play </font> games.    
]]>
</string>

Java:

TextView tv = (TextView) findViewById(R.id.tv_txt);
tv.setText(Html.fromHtml(getString(R.string.html_text)));



文/Hevin丶(简书作者)
原文链接:http://www.jianshu.com/p/ea5f8713c9a3
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值