安卓开发文档翻译:字符串资源,String Resources
字符串资源,为妳的应用程序提供了文本字符串,并且可附带可选的文本样式和格式化选项。有三种资源,它们都可为妳的应用程序提供字符串:
提供单个字符串的XML资源。
提供一个字符串数组的XML资源。
针对复数而提供字符串的XML资源。
所有 的字符串都可以用上一些样式标记 以及格式化参数。欲知更多关于字符串样式 和格式化的信息,则阅读 格式 化和样式 小节。
可从应用程序代码或其它资源文件(例如XML布局)中引用的单个字符串。
注意 : 字符串,实际 上是一个以 name 属性 的值 ( 而不是 XML 文件的名字 ) 来引用 的简单资源。所以 ,妳可以在同一个XML 文件中将字符串资源与其它简单资源混合放置在同一个 <resources> 元素中。
文件位置:
res/values/
filename
.xml
文件
名是任意的。
<string>
元素
的
name
属性
会被用作资源编号。
编译后的资源数据类型:
指向 一个 String 的资源指针。
资源引用方式:
在Java 代码中:
R.string.
string_name
在XML 代码中:
@string/
string_name
语法:
<?xml version="1.0" encoding="utf-8"?>
< resources >
< string
name=" string_name "
> text_string </string>
</resources>
元素:
必选。 它必须是根节点。
无属性。
一个字符串,其中可包含样式标记。注意 ,必须对单引号和双引号进行转义。欲知关于如何正确 地 对字符串进行样式设置及格式化的信息,则阅读下文的 格式 化及样式设置 。
属性:
name
字符串 。该字符串资源的名字。 这个名字会被用作资源编号。
示例:
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(int) 来获取一个字符串。 getText(int) 会保留 该字符串中自带的富文本样式属性。
可通过程序代码引用到的一个由字符串组成的数组。
注意 : 字符串数组,实际 上是一个以 name 属性 的值 ( 而不是 XML 文件的名字 ) 来引用 的简单资源。所以 ,妳可以在同一个XML 文件中将字符串数组资源与其它简单资源混合放置在同一个 <resources> 元素中。
文件位置:
res/values/
filename
.xml
文件
名是任意的。
<string-array>
元素
的
name
属性
会被用作资源编号。
编译后的资源类型;
指向 一个 String 数组的资源指针。
资源引用:
在Java 代码中: R.array. string_array_name
语法:
<?xml version="1.0" encoding="utf-8"?>
< resources >
name=" string_array_name ">
< item
> text_string </item>
</string-array>
</resources>
元素:
必选。 它必须是根节点。
无属性。
定义 一个由字符串组成的数组。包含 着一到多个 <item> 元素。
属性:
name
字符串 。此数组的名字。 这个名字将被用作引用该数组时使用的资源编 号。
一个字符串,其中 可包含样式标记。 它的值,可以是指向另一个字符串资源的引用。必须 是某个 <string-array> 元素的子代元素。 注意 ,必须对单引号和双引号进行转义。欲知关于如何正确 地 对字符串进行样式设置及格式化的信息,则阅读下文的 格式 化及样式设置 。
无属性。
示例:
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);
不同的自然语言中,对于复数的表达方式不同。例如, 在英语中, 1 这个数量是一个特殊情况。 我们会写 "1 book" ,但是,对于任意的其它数量,我们会写 " n books" 。 这种区分单数和复数形态 的情况是狠常见的, 而别的一些语言甚至有更细致的区分。安卓支持 的形态包括: 0( zero )、1( one )、2( two )、几个( few )、狠多( many )及其它( other )。
对于特定 的语言 和数量的组合 ,用来确定使用哪种形态 的规则可能 会是特别复杂的,因此,安卓 为妳提供了一些方法 ,例如 getQuantityString() , 以用来选择适当的资源。
尽管由于历史原因 而称它为“ 带数量的字符串 ”("quantity strings")( 在应用编程接口中仍然是那么叫 的 ),但是, 这种字符串 只 应当被用于表达复数。 不能用这个来实现其它功能 ,例如, 不能用来实现Gmail 中的"Inbox" 和"Inbox (12)"(这表示有未读消息) 两种字符串的区分。 看起来,使用这种字符串比使用 if 语句要方便一些,但是, 请注意,某些语言(例如华语)中,根本 不进行这种语法上的区分的,那种情况 下, 妳 将永远获取到其它( other )字符串。
对于应当使用哪个字符串 的选择,完全是基于对应语言 的语法来作出的。 在英语中,数量 为0( zero )的字符串会被无视,因为 ,在语法上, 0 与 2或者其它 不为 1 的数量是没有任何区别的 ("zero books" 、 "one book" 、 "two books"等等) 。相反 地,在韩语中, 只有 其它数量 ( other )字符串会被使用。
请不要被误导,以 为 two 只能 被应用为数量 2 : 在某个语言中,可能会出现, 2 、 12 、 102(等等) 都使用相同的复数形式,但是又与其它数量不同。 请相信妳的翻译 人员,她们知道对于特定 的语言 要做什么样的区分。
通常,可以使用一种对于数量不敏感的形式来避免数量字符串的麻烦,例如"Books: 1"。如果妳的程序中可以采用这种形式的话,那么将会使得妳和翻译人员的工作都轻松许多。
注意 : 复数集合,实际 上是一个以 name 属性 的值 ( 而不是 XML 文件的名字 ) 来引用 的简单资源。所以 ,妳可以在同一个XML 文件中将复数资源与其它简单资源混合放置在同一个 <resources> 元素中。
文件位置:
res/values/
filename
.xml
文件
名是任意的。
<plurals>
元素
的
name
属性
会被用作资源编号。
资源引用方式:
在Java 代码中: R.plurals. plural_name
语法:
<?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>
元素:
必选。 它必须是根节点。
无属性。
一个字符串集合, 会依据某个东西的数量来从中选择一个字符串。包含 一到多个 <item> 元素。
属性:
name
字符串 。 这组字符串的名字。 这个名字将被用作资源编号。
一个复数或单数形式的字符串。 它的值可以是指向另一个字符串资源的引用。必须 是某个 <plurals> 元素的子代元素。 注意 ,必须对单引号和双引号进行转义。欲知关于如何正确 地 对字符串进行样式设置及格式化的信息,则阅读下文的 格式 化及样式设置 。
属性:
quantity
关键 字 。 一个值,表明该字符串应当应用于哪种数量 。 下表列出有效的值,并且举出若干示例:
值 |
说明 |
zero |
该语言要求对数量0做特殊处理(例如阿拉伯语)。 |
one |
该语言要求对于像1这样的数量做特殊处理(例如英语及大部分其它语言中的数量1;在苏联语中,以1结尾却不以11结尾的数量也是这一类)。 |
two |
该语言要求对于像2这样的数量做特殊处理(例如威尔士 语中的2,或者 斯洛文尼亚 语中的102)。 |
few |
该语言要求对“较小”的数量进行特殊处理(例如捷克语 中的2、3和4;或者波兰语中,以2、3或4结尾却不以12、13 或14 结尾的数量)。 |
many |
该语言要求对“较大”的数量进行特殊处理(例如马尔他语 中以11-99 结尾的数量)。 |
other |
该语言并不要求对于当前给出的数量进行特殊处理(例如华语中所有的数量都不要求特殊处理,或者英语中的42)。 |
示例:
XML文件,保存 在 res/values/strings.xml :
<?xml version="1.0" encoding="utf-8"?>
<resources>
<plurals name="numberOfSongsAvailable">
<!--
作为一个开发者,妳应当提供“1”( "one" )和“其它”( "other" )数量的字符 串。 妳的翻译人员知道,对于她们的语言,需要用哪个字符串。 在“1”("one")中,应当包含%d,因为 ,对于那些"one" 不只代表1的语言 (上文已经说明过) ,翻译人员将需要使用%d 。
-->
<item quantity="one">%d song found.</item>
<item quantity="other">%d songs found.</item>
</plurals>
</resources>
XML文件,保存 在 res/values-pl/strings.xml :
<?xml version="1.0" encoding="utf-8"?>
<resources>
<plurals name="numberOfSongsAvailable">
<item quantity="one">Znaleziono %d piosenkę.</item>
<item quantity="few">Znaleziono %d piosenki.</item>
<item quantity="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 参数用来选中适当 的复数字符串, 而 第二 个 count 参数 会被插入到 %d 占位符处。如果 妳的复数字符串中 不包含字符串格式 化内容的话,那么, 妳不需要向 getQuantityString 传入第三个参数。
以下是一些重要注意事项,说明的是,如何正确地对字符串资源进行格式化和样式设置。
如果妳的字符串中包含有单引号或双引号,那么,妳必须对它进行转义,或者使用另一种引号来包围整个字符串。例如,下面举出一些正确及错误的例子:
<string name="good_example">"This'll work"</string>
<string name="good_example_2">This\'ll also work</string>
<string name="bad_example">This doesn't work</string>
<string name="bad_example_2">XML encodings don't work</string>
如果 妳需要使用 String.format(String, Object...) 来对字符串进行格式化的话,那么, 妳可以将格式 化参数放置在该字符串资源中。例如, 以下这个资源:
<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>
在这个例子中,格式 化字符串有两个参数: %1$s 是一个字符串, %2$d 是一个10进制数字。 妳可以在程序代码中提供参数,以对该字符串进行格式化:
Resources res = getResources() ;
String text = String. format (res.getString(R.string.welcome_messages), username, mailCount);
妳可以使用HTML 标记来对字符串添加样式信息。例如:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="welcome">Welcome to <b>Android</b>!</string>
</resources>
支持以下HTML元素:
•. <b> 实现 粗体 。
•. <i> 实现 斜体 。
•. <u> 实现 下划线 。
有些时候,妳 可能想要创建一个 可用作格式化字符串的带样式的文本资源。正常 来讲, 这样是做不到的,因为 String.format(String, Object...) 方法 会将字符串中的样式信息去掉。当然 ,这种情况是可以绕过的,具体做法 就是, 以转义实体的形式来写入那些 HTML标记, 并在格式化生效之后使用 fromHtml(String) 来恢复它们。例如:
1. 将妳的带有HTML 转义标记的样式文本资源写入到资源文件中:
<resources>
<string name="welcome_messages">Hello, %1$s! You have <b>%2$d new messages</b>.</string>
</resources>
在这个格式化字符串中,添加了一个 <b> 元素。注意 ,左括号 被按照 HTML规则转义 了,转义 符是 < 。
2. 然后 ,照常对 该 字符串进行格式化,但是,记得 还要调用 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);
Spannable ,是一个文本对象, 妳可以使用像颜色和字体尺寸这样的属性来对它进行样式设置。 妳使用 SpannableStringBuilder 来构造妳的文本,然后 ,将 android.text.style 包中定义的样式应用到该文本上。
妳可以使用以下的辅助方法来完成创建小文本的过程中的大部分工作:
/**
* 返回 一个 CharSequence ,它是将指定 的CharSequence对象数组连接起来,然后 向整个范围应用0到多个标记之后的结果。
*
* @param content 要对其应用某个样式的字符序列的数组
* @param tags 要向上应用的那些 带样式的 小文本 对象 ,例如 android.text.style.StyleSpan
*
*/
private static CharSequence apply(CharSequence[] content, Object... tags) {
SpannableStringBuilder text = new SpannableStringBuilder();
openTags(text, tags);
for (CharSequence item : content) {
text.append(item);
}
closeTags(text, tags);
return text;
}
/**
* 遍历 一 个标记数组, 并将它们应用到指定Spannable 对象 的开头处,
* 这样,日后追加 上去的文本也会被应用该样式。
* 不要直接调用这个方法。
*/
private static void openTags(Spannable text, Object[] tags) {
for (Object tag : tags) {
text.setSpan(tag, 0, 0, Spannable.SPAN_MARK_MARK);
}
}
/**
* “关闭”某个Spannable 上指定的标记,具体做法 就是, 将那些小文本更新为互斥 的终点,
* 这样,日后追加的文本 不会再具有该样式。
* 不要直接调用这个方法。
*/
private static void closeTags(Spannable text, Object[] tags) {
int len = text.length();
for (Object tag : tags) {
if (len > 0) {
text.setSpan(tag, 0, len, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
} else {
text.removeSpan(tag);
}
}
}
以下的 bold 、 italic 和 color 方法, 向妳展示了,如何调用那些辅助方法 以应用 android.text.style 包中定义的那些样式。 妳可以创建类似的方法,以进行其它类型的文本样式设置。
/**
* 返回 一个 CharSequence ,它是向指定 的CharSequence 对象连接起来之后 的对象应用粗体效果的结果。
*/
public static CharSequence bold(CharSequence... content) {
return apply(content, new StyleSpan(Typeface.BOLD));
}
/**
* 返回 一个 CharSequence ,它是向指定 的CharSequence 对象连接起来之后 的对象应用 斜 体效果的结果。
*/
public static CharSequence italic(CharSequence... content) {
return apply(content, new StyleSpan(Typeface.ITALIC));
}
/**
* 返回 一个 CharSequence ,它是向指定 的CharSequence 对象连接起来之后 的对象应用前景颜色效果的结果。
*/
public static CharSequence color(int color, CharSequence... content) {
return apply(content, new ForegroundColorSpan(color));
}
以下是一个示例,展示的是,如何连锁地使用这些方法,以创建一个对不同单词应用了不同样式类型的字符序列:
// 创建一个斜体的"hello, ",一个红色的"world",
// 然后对整个序列应用粗体。
CharSequence text = bold(italic(res.getString(R.string.hello)),
color(Color.RED, res.getString(R.string.world)));
好强的妖气
Your opinionsHxLauncher: Launch Android applications by voice commands