字符串资源给应用程序提供带有文本样式和格式选项的文本字符串。能够给应用程序提供三种类型的字符串资源:
1. String
提供单一字符串的XML资源。
2. String Array
提供一个字符串数组的XML资源
3. Quantity Strings(Plurals)
同一个单词或短语在不同数量时所使用的不同字符串的XML资源文件。通常指单词或短语的单/复数形式。
所有的字符串都有使用一些样式标记和格式化参数的能力。
String
应用程序的代码中或其他资源的XML文件(如XML布局文件)中能够引用的一个单一字符串。
注意:字符串是一个简单的资源,能够使用name属性(不是XML文件的名字)的值来引用这个字符串。因此,可以把字符资源与其他类型的简单资源组合到一个XML文件的<resources>元素下。
文件位置(FILE LOCATION):
res/values/filename.xml
文件名是任意的,<string>元素的name属性值会被用作资源ID。
被编译资源的数据类型(COMPILED RESOURCE DATATYPE):
资源指向一个String对象。
资源引用(RESOURCE REFERENCE):
在Java代码中:R.string.string_name;
在XML中:@string/string_name。
语法(SYNTAX):
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string
name="string_name"
>text_string</string>
</resources>
元素(ELEMENTS):
<resources>
必须的。它必须是根节点。没有属性。
<string>
定义一个字符串,它能够包含样式标签。要注意的是,单引号和双引号必须做语义转换。
属性(ATTRIBUTES):
name
字符串值,它定义了字符串的名称,这个名称会被用于资源ID。
例子(EXAMPLE):
XML文件被保存在res/values/strings.xml中:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello!</string>
</resources>
以下布局XML会这个字符串应用到一个View对象上:
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
以下是应用程序代码获取字符串资源的方法:
String string = getString(R.string.hello);
可以使用getString(int)或getText()方法来获取一个字符串。getText(int)方法会获取使用样式的字符串的富文本。
String Array
定义能够被应用程序引用的字符串数组。
注意:字符串数组是一个简单资源,使用name(不是XML文件的名字)属性中提供的值来引用。例如,能够把字符串数组资源和其他的简单资源组合到一个XML文件的<resources>元素下。
文件位置(FILE LOCATION):
res/values/filename.xml
文件名是任意的。<string-array>元素的name属性值被用做资源ID。
被编译资源的数据类型(COMPILED RESOURCE DATATYPE):
资源指向一个字符串数组对象。
资源引用(RESOURCE REFERENCE):
在Java代码中:R.array.string_array_name
语法(SYNTAX):
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array
name="string_array_name">
<item
>text_string</item>
</string-array>
</resources>
元素(ELEMENTS):
<resources>
必须的。它必须是根节点。没有属性。
<string-array>
定义一个字符串数组,它要包含一个或多个<item>元素。
属性(ATTRIBUTES):
name
字符串值,它定义了数组的名称。这个名称被用于引用数组的资源ID。
<item>
定义一个能够包含样式标签的字符串,它的值可以是另一个字符串资源的应用。它必须是<string-array>元素的子元素。要注意的是,单引号和双引号必须进行转义处理。
它没有属性。
例子(EXAMPLE):
XML文件被保存在res/values/strings.xml中:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="planets_array">
<item>Mercury</item>
<item>Venus</item>
<item>Earth</item>
<item>Mars</item>
</string-array>
</resources>
以下应用程序代码获取字符串数组的方法:
Resources res =getResources();
String[] planets = res.getStringArray(R.array.planets_array);
Quantity Strings(Plurals)
不同的语言对于数量有不同的语法规则。例如,在英语中,数量1是一种特殊的情况,被写做1 book,但是其他的数量要被写成n book。这是非常普通的单/复数之间的区分,而其他的语言会有更细的区分。Android支持的完整设置如下:zero、one、two、few、many和other。
用给定的语言和数量来判断使用哪一种规则是非常复杂的,因此Android提供了一些方法,来为应用程序选择合适的资源,如getQuantityString()方法。
要注意的是,选择是基于语言语法的必要性。在英语中对于数量设置为zero的字符串,即使是数量为0也会被忽略,因为0数量在语法上除了1以外,与其他数量没有区别(zero books、one book、two books等等)。不要被表面现象所误导,要根据实际的语言语法差异来进行区分。
通常要尽可能的使用中性的数量描述来避免语言语法的差异,如“Books:1”。如果在应用程序中保持这种风格,这将使处理语言语法上的差异变得更加容易。
注意:一个复数单词和短语的集合是一个简单的资源,使用name属性中提供的值就可以引用这个资源。例如,可以把复数单词或短语的资源与其他简单的资源一起组合到一个XML文件的<resources>元素中。
文件位置(FILE LOCATION):
res/values/filename.xml
文件名是任意的。<plurals>元素的name属性值将会被用作资源ID。
资源引用(RESOURCE REFERENCE)
在Java代码中:R.plurals.plural_name
语法(SYNTAX):
<?xml version="1.0" encoding="utf-8"?>
<resources>
<plurals
name="plural_name">
<item
quantity=["zero" | "one" | "two" | "few" | "many" | "other"]
>text_string</item>
</plurals>
</resources>
元素(ELEMENTS):
<resources>
必须的,它必须是根节点。没有属性。
<plurals>
它定义了一个字符串的集合,集合提供的每一个字符串都要依赖于某些数量词。它包含了一个或多个<item>元素。
属性(ATTRIBUTES):
name
一个字符串值,它定义字符串的名称,这个名称被用作资源ID。
<item>
它定义了一个单数或复数场合使用的字符串。它能够引用另一个字符串资源。它必须是<plurals>元素的子元素。要注意的是,单引号和双引号必要要使用转义字符。
属性(ATTRIBUTES):
quatity
它是一个关键词,用于指示该字符串所使用的时机。有效值如下:
值 |
说明 |
zero |
当语言中需要对数量词0进行特殊处理时,要使用这个设置(如阿拉伯语) |
one |
当语言中需要对像1这样的数量词进行特殊处理时,要使用这个设置(如英语) |
two |
当语言中需要对像2这样的数量词进行特殊处理时,要使用这个设置(如威尔士语) |
few |
当语言中需要对小的数量词进行特殊处理时,要使用这个设置。(如捷克语中带有2、3和4的数量词;或是波兰语中以2、3、4结尾但不是12、13、14的数量词。) |
many |
当语言中需要对大的数量词进行特殊处理时,要使用这个设置。(如马耳他语中以11---99之间的数字结尾的数量词。) |
other |
当语言中不需要对给定的数量进行特殊处理时,使用这个设置。 |
例子(EXAMPLE):
XML文件被保存在res/values/strings.xml和res/values-pl/strings.xml中:
res/values/strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<pluralsname="numberOfSongsAvailable">
<itemquantity="one">One song found.</item>
<itemquantity="other">%d songs found.</item>
</plurals>
</resources>
res/values-pl/strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<pluralsname="numberOfSongsAvailable">
<itemquantity="one">Znaleziono jedną piosenkę.</item>
<itemquantity="few">Znaleziono %d piosenki.</item>
<itemquantity="other">Znaleziono %d piosenek.</item>
</plurals>
</resources>
Java代码中的用法如下:
int count = getNumberOfsongsAvailable();
Resources res =getResources();
String songsFound = res.getQuantityString(R.plurals.numberOfSongsAvailable, count, count);
当使用getQuantityString()方法时,如果字符串中包含了带有数字的字符串格式,就需要传递count参数两次。例如,对于字符串“%d songs found”,第一个count参数会选择合适的复数字符串,第二个参数会插入到%d位置。如果复数字符串不包含格式化字符,就不需要传递第三个参数给getQuantityString()方法。
字符串的格式化和样式化
以下是有关如何正确的格式化和样式化字符串资源的一些重要的事情:
1. 转义单引号和双引号
如果在字符中有单引号或双引号,那么既可以通过转义字符转义,也可以把整个字符串封闭在其他类型的封闭引号内。例如,以下字符串资源的定义会导致在某些场合下不能够工作:
<stringname="good_example">"This'll work"</string>
<stringname="good_example_2">This\'ll also work</string>
<stringname="bad_example">This doesn't work</string>
<stringname="bad_example_2">XML encodings don't work</string>
注:以下是Android XML资源定义时可能使用的转义字符(编写时要包含结尾的“;”号):
” => " 或 "
’ => ' 或 '
& => & 或 &
< => < 或 <;
> => &62; 或 >
空白字符的转义
空格 =>  
Tab => 	
回车 => 
换行 => 

2. 格式化字符串
如果需要使用String.format(String, Object…)方法来格式化字符串,那么就能够把格式化参数放到字符串资源中,例如:
<stringname="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>
在这个例子中,格式化字符串有两个参数:%1$s代表一个字符串,%2$d代表一个十进制的数字。在代码中使用如下方法来替换资源定义中的格式化字符串:
Resources res =getResources();
String text =String.format(res.getString(R.string.welcome_messages), username, mailCount);
3. 用HTML标签给字符串添加样式
使用如下方法,可以给XML中的字符串资源添加样式:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<stringname="welcome">Welcome to <b>Android</b>!</string>
</resources>
Android支持的HTML元素包括:
<b>:把文本设置为粗体;
<i>:把文本设置为斜体;
<u>:给文本添加下划线。
有些时候,需要创建一个添加了样式的文本,同时还要使用格式化字符串。通常这样做是不会工作的,因为String.format()方法会去掉字符串中的所有样式信息。因此要围绕HTML标签进行字符转义工作,然后再格式化处理之后,调用fromHtml(String)方法来获取字符串资源,例如:
A. 把设置样式的文本资源中HTML标签转义后保存。
<resources>
<stringname="welcome_messages">Hello, %1$s! You have <b>%2$d new messages</b>.</string>
</resources>
在这个格式化的字符串中,添加了HTML的<b>元素,要注意的是:标签中的”<”被转义为”<”
B. 然后用普通的方法来格式化字符串,但要调用fromHtml(String)方法吧HTML文本转换成样式文本:
Resources res =getResources();
String text =String.format(res.getString(R.string.welcome_messages), username, mailCount);
CharSequence styledText =Html.fromHtml(text);
因为fromHtml(String)方法会格式化所有的HTML实体,所以对于要使用的格式化文本,必须调用htmlEncode(String)方法,确保其中的任何HTML字符都被转义。例如,如果传递给String.format()的字符串参数中包含了诸如”<”或”&”等符号,那么它们在被格式化之前,必须被转义,以便在格式化之后的字符被传递给fromHtml(String)方法时,被转换成初始编写的样子。例如:
String escapedUsername =TextUtil.htmlEncode(username);
Resources res =getResources();
String text =String.format(res.getString(R.string.welcome_messages), escapedUsername,mailCount);
CharSequence styledText =Html.fromHtml(text);