字符串(String)資源
string資源爲應用程序提供字符串文本,並可附帶文本樣式和格式。有以下三種類型的string資源可供應用程序使用:
提供單個字符串的XML資源。
提供字符串數組的XML資源。
保存單詞或詞組各種數量形式(單數/複數)下的字符串XML資源。
所有字符串都能應用各種樣式標記及格式參數。樣式化和格式化串的信息請參閱章節格式化和樣式化。
能被應用程序或者其他資源文件(比如layout XML)引用的單個字符串。
注意:字符串是簡單類型資源,是用名稱(name)(而非XML文件名)來直接引用的。因此,在一個XML文件裏,可以把字符串資源和其他簡單類型資源一起放在一個<resources>元素下。
文件位置:
res/values/filename.xml
文件名可隨意指定。<string>元素的name將被用作資源ID。
編譯後資源的數據類型:
指向String
的資源指針。
資源引用:
Java代碼::R.string.string_name
XML代碼:@string/string_name
語法:
<?xml version="1.0" encoding="utf-8"?> name="string_name"
</resources> |
元素:
必填項。必須是根元素。
無屬性。
<string>
可以包含樣式標記的字符串。注意須對單引號或雙引號進行轉義。更多信息請參閱下文格式化和樣式化。
屬性:
name
String類型。字符串的名稱。此名稱將作爲資源ID用於引用此字符串。
示例:
保存在res/values/strings.xml 的XML文件:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello!</string> </resources> |
以下佈局(layout)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)
會一併讀取應用於字符串的rich
text樣式。
可被應用程序引用的字符串數組。
注意:字符串數組是簡單類型資源,是用名稱(而非XML文件名)來直接引用的。因此,在一個XML文件裏,可以把字符串數組資源和其他簡單類型資源一起放入一個<resources>元素下。
文件位置:
res/values/filename.xml
文件名可隨意指定。<string-array>元素的名字name將被用作資源ID。
編譯後資源的數據類型:
指向String
數組的資源指針。
資源引用:
Java代碼::R.array.string_array_name
語法:
<?xml
version="1.0" encoding="utf-8"?> name="string_array_name"> <item >text_string</item> </string-array> </resources> |
元素:
必填項。必須是根元素。
無屬性。
定義一個字符串數組。包含了一個或多個<item>元素。
屬性:
Name
String類型。字符串數組的名稱。此名稱將作爲資源ID用於引用此數組。
一個字符串,可以包含樣式標識。可以是對其他字符串資源的引用。必須作爲<string-array>元素的子元素存在。注意對單引號和雙引號須進行轉義。有關如何正確地樣式化及格式化字符串,請參閱下文格式化和樣式化。
無屬性。
示例:
保存在res/values/strings.xml 的XML文件:
<?xml
version="1.0" encoding="utf-8"?> <resources> <string-array name="planets_array"> <item>Mercury</item></string-array> <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”。這種單複數之間的區別是很普遍的,不過其他語言會有更好的區分方式。Android支持的全集包括zero、one、 two、few、many和other。
要判定某種語言對數量在各種情況下的表示,規則可能會很複雜。所以Android提供了諸如getQuantityString()的方法來選擇合適的資源。
注意,要按照語法規則來建立可選項。在英語裏,即使數量爲0,字符串零(zero)也不需要建立。因爲0在英語語法表達上和2沒有區別,和其他除1以外的任何數字都沒有差別("zero books", "one book", "two books",等等)。 不要被現實生活所誤導:two聽起來似乎只能用於數量2。某語言可能需要2、12、102(等等)和1一樣形式表示,而又與其他數的形式都不同。請依靠翻譯人員來了解一下實際語言中的差別。
如果和應用程序的風格一致,常可以用諸如“Books: 1”的模糊數量形式來避免使用數量字符串。這會讓你和翻譯人員都輕鬆些。
注意:複數字符串是簡單類型資源,是用名稱(name)(而不是XML文件名)來直接引用的。因此,在一個XML文件裏,可以把複數字符串資源和其他簡單類型資源一起放在一個<resources>元素下。
文件位置:
res/values/filename.xml
文件名可隨意指定。<plurals>元素的名字name將被用作資源ID。
資源引用:
Java代碼::R.plurals.plural_name
語法:
<?xml
version="1.0" encoding="utf-8"?> name="plural_name">
quantity=["zero" | "one" | "two" | "few" | "many" | "other"] >text_string</item> </plurals> </resources> |
元素:
必填項。必須是根元素。
無屬性。
一個字符串集,每個數量表示提供一個字符串。包含一個或多個<item>元素。
屬性:
name
String類型。字符串對的名稱。此名稱將作爲資源ID。
一個單數或複數形式的字符串。可以是對其他字符串資源的引用。必須作爲<plurals>元素的子元素存在。注意須對單引號和雙引號進行轉義。有關如何正確地樣式化及格式化字符串,請參閱下文格式化和樣式化。
屬性:
quantity
關鍵字。 表示要使用此字符串的數量值。以下是合法的值(括號內列出部分語言要求):
值 |
描述 |
zero |
語言需要對數字0進行特殊處理。(比如阿拉伯語) |
one |
語言需要對類似1的數字進行特殊處理。(比如英語和其它大多數語言裏的1;在俄語裏,任何以1結尾但不以11結尾的數也屬於此類型。) |
two |
語言需要對類似2的數字進行特殊處理。(比如威爾士語) |
few |
語言需要對較小數字進行特殊處理(比如捷克語裏的2、3、4;或者波蘭語裏以2、3、4結尾但不是12、13、14的數。) |
many |
語言需要對較大數字進行特殊處理(比如馬耳他語裏以11-99結尾的數) |
other |
語言不需要對數字進行特殊處理。 |
示例:
存放在res/values/strings.xml 的XML文件:
<?xml version="1.0" encoding="utf-8"?> <resources> <plurals name="numberOfSongsAvailable"> <item quantity="one">One song found.</item> <item quantity="other">%d songs found.</item> </plurals> </resources> |
存放在res/values-pl/strings.xml 的XML文件:
<?xml version="1.0" encoding="utf-8"?> <resources> <plurals name="numberOfSongsAvailable"> <item quantity="one">Znaleziono jedną piosenkę.</item> <item quantity="few">Znaleziono %d piosenki.</item> <item quantity="other">Znaleziono %d piosenek.</item> </plurals> </resources> |
Java代碼:
int count = getNumberOfsongsAvailabl
Resources res = getResources(); String songsFound =res.getQuantityString(R.plurals.numberOfSongsAvailable, count,count); |
在使用getQuantityString()方法時,如果字符串包含數字格式化串,則需要傳遞2個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="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)資源裏。比如存在以下資源:
<string name="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); |
用HTML標記來樣式化
可以用HTML 標記來爲字符串加入樣式。例如:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="welcome">Welcome to <b>Android</b>!</string> </resources> |
支持以下HTML元素:
·
·
·
有時可能要創建一個樣式化的文本資源,並可作爲格式化串使用。通常這不能生效,因爲String.format(String, Object...)方法會去除字符串內的所有的樣式信息。解決方法是寫入一段轉義後的HTML標記,然後在格式化後再用fromHtml(String)恢復出這些樣式。例如:
1.
<resources>
</resources> |
在這個格式化字符串裏,加入了一個<b>元素。注意左尖括號是用標記<轉義過的HTML。
2.
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); |