文章目录
- 基础使用
- 1. String
- 2. String Array
- 进阶使用
- 1. 特殊字符转义
- 2. 设置字符串格式
- 3. 使用HTML标记设置样式
- 4. 使用注解设置样式
- 注意事项❗❗❗
- 1. 不同页面复用问题
- 2. 多语言开发
- 2.1 字符串格式化
- 2.2 富文本
- 2.3 单复数
官方文档:
字符串资源 | Android 开发者 | Android Developers (google.cn)
以下部分内容转载自简书:不可不知的 Android strings.xml 那些事 - 简书 (jianshu.com)
基础使用
1. String
资源文件设置
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">hello world!</string>
</resources>
layout布局文件调用:
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
kotlin代码调用:
val string: String = getString(R.string.hello)
2. String Array
资源文件设置
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="planet_array">
<item>Mercury</item>
<item>Venus</item>
<item>Earth</item>
<item>Mars</item>
</string-array>
</resources>
kotlin代码调用:
val planetArr: Array = resources.getStringArray(R.array.planets_array)
进阶使用
1. 特殊字符转义
字符 | 转义 |
大部分符号 | 在前加“\” |
< | < |
& | & |
2. 设置字符串格式
多语言开发时,千万不要使用字符串拼接的方法,因为不同语言的句子顺序是多样的,字符串拼接会让你的逻辑非常复杂。
这个时候就可以考虑使用字符串格式化了:
<!--strings.xml-->
<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>
//kotlin代码
val res = resources
val str = String.format(res.getString(R.string.welcome_messages), username, mailCount); // 注意参数的顺序。
%1$s 代表了会格式化的字符串,%2$d 代表了会格式化的数值并在第二的位置,大家可以以此类推。
3. 使用HTML标记设置样式
支持的HTML元素
效果 | HTML元素 |
粗体 | <b>、<em> |
斜体 | <i>、<cite>、<dfn> |
文本放大 25% | <big> |
文本缩小 20% | <small> |
设置字体属性 | <font face=”font_family“ color=”hex_color”>。可能的字体系列示例包括 monospace、serif 和 sans_serif。 |
设置等宽字体系列 | <tt> |
删除线 | <s>、<strike>、<del> |
下划线 | <u> |
上标 | <sup> |
下标 | <sub> |
列表标记 | <ul>、<li> |
换行符 | <br> |
区隔标记 | <div> |
CSS 样式 | <span style=”color|background_color|text-decoration”> |
段落 | <p dir=”rtl | ltr” style=”…”> |
示例:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="welcome">Welcome to <b>Android</b>!</string>
</resources>
4. 使用注解设置样式
今天累了,不想再看了,感兴趣的自己了解吧。
官方链接:字符串资源 | Android 开发者 | Android Developers (google.cn)
注意事项❗❗❗
1. 不同页面复用问题
代码复用可以让程序更加简洁。但在某些时候可能会造成麻烦。
比如,想象下你在应用中的登录和注册界面中都是用了相同的字符串,之后如果产品需求变更,要分别使用不同的提示语,那就不得不新创建两个 string 并在代码中配置它们。所以如果从一开始就为不同页面分别配置,那需要做的就仅仅是修改下 strings.xml 文件。
更容易忽略的一个原因是,如果你们的应用不想只是面对国内用户,还要面对其他语系的用户的话,有些语言可能会造成意想不到的问题。因为一些语言同样一个意思在不同的语境下,会用到不同的单词,个中滋味经历过的自然会懂。
千万不要对此觉得麻烦,使用这样的方式来组织 strings.xml 文件,在应用变得复杂后,还能够很简单的通过搜索甚至观察的方式来找出你想要修改的字符串。
<!-- 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 -->
2. 多语言开发
2.1 字符串格式化
多语言开发时,千万不要使用字符串拼接的方法,因为不同语言的句子顺序是多样的,字符串拼接会让你的逻辑非常复杂。
这个时候就可以考虑使用字符串格式化了。
2.2 富文本
大家可能知道用 ForegroundColorSpan、SpannableStringBuilder能够高亮一段文本中的某些内容,但这对于多语言应用来说可能并不是最好的方式,因为这两个方法都要依靠待高亮文字的具体位置作为参数。如果应用需要支持的语言多了之后,这就会写大量的 Java 代码,和频繁计算待高亮内容位置。
这个时候就可以试试用 HTML:
要上架平台的app,谨慎使用HTML,有的平台不让
<string name="html_text" formatted="false">
<![CDATA[
<font color=\'#28b5f5\'>Hello</font> world.
]]>
</string>
val tv: TextView = findViewById(R.id.tv_txt);
tv.text = Html.fromHtml(getString(R.string.html_text));
2.3 单复数
中文不需要区分单复数,可跳过该节
BAD:像下面这样处理单词复数问题,因为不同的语言针对复数会有不同的语法规则。
<!-- strings.xml start -->
<string name="song">song</string>
<string name="songs">songs</string>
<!-- strings.xml end -->
GOOD:使用[官方提供的getQuantityString](https://developer.android.google.cn/reference/android/content/res/Resources?hl=zh-cn#getQuantityString(int, int))等方法来帮助选择合适的资源。
字符串集合,包含n个item元素(n >= 1)
name属性: 资源ID
quantity属性:关键词,表示在何时使用该值。常用有效值:one、other
<plurals name="numberOfSongsAvailable">
<item quantity="one">%d song</item>
<item quantity="other">%d songs</item>
</plurals>
val count = 2
val songsFound = resources.getQuantityString(R.plurals.numberOfSongsAvailable, count, count)
“one”>%d song
%d songs
```kotlin
val count = 2
val songsFound = resources.getQuantityString(R.plurals.numberOfSongsAvailable, count, count)