字符串資源給應用程序提供帶有文本樣式和格式選項的文本字符串。能夠給應用程序提供三種類型的字符串資源:
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);