編輯:Android開發實例
前言
本章內容為Android開發者指南的Framework Topics/Application Resources/Resource Types/String章節,譯為"字符串資源",版本為Android 4.0 r1,翻譯來自:"呆呆大蝦"。
Resources Types - String
譯者署名: 呆呆大蝦
譯者微博:http://weibo.com/popapa
版本:Android 4.0 r1
原文
http://developer.android.com/guide/topics/resources/style-resource.html
字符串資源
string資源為應用程序提供字符串文本,並可附帶文本樣式和格式。有以下三種類型的string資源可供應用程序使用:
String
提供單個字符串的XML資源。
String Array
提供字符串數組的XML資源。
Quantity Strings (復數)
保存單詞或詞組各種數量形式(單數/復數)下的字符串XML資源。
所有字符串都能應用各種樣式標記及格式參數。樣式化和格式化串的信息請參閱章節格式化和樣式化。
String
能被應用程序或者其他資源文件(比如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"?>
<resources>
<string name="string_name">text_string</string>
</resources>
元素
<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樣式。
String Array
可被應用程序引用的字符串數組。
注意:字符串數組是簡單類型資源,是用名稱(而非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"?>
<resources>
<string-array
name="string_array_name">
<item
>text_string</item>
</string-array>
</resources>
元素
<resources>
必填項。必須是根元素。
無屬性。
<string-array>
定義一個字符串數組。包含了一個或多個<item>元素。
屬性:
Name
String類型。字符串數組的名稱。此名稱將作為資源ID用於引用此數組。
<item>
一個字符串,可以包含樣式標識。可以是對其他字符串資源的引用。必須作為<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);
Quantity Strings(復數)
不同的語言對數量進行描述的語法規則也不同。比如在英語裡,數量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"?>
<resources>
<plurals
name="plural_name">
<item_plurals
quantity=["zero" | "one" | "two" | "few" | "many" | "other"]
>text_string</item>
</plurals>
</resources>
元素
<resources>
必填項。必須是根元素。
無屬性。
<plurals>
一個字符串集,每個數量表示提供一個字符串。包含一個或多個<item>元素。
屬性:
name
String類型。字符串對的名稱。此名稱將作為資源ID。
<item>
一個單數或復數形式的字符串。可以是對其他字符串資源的引用。必須作為<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 = getNumberOfsongsAvailable();
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元素:
· <b>文本加粗bold。
· <i>文本變斜體italic。
· <u>文本加下劃線underline。
有時可能要創建一個樣式化的文本資源,並可作為格式化串使用。通常這不能生效,因為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);
Android應用程序可以在許多不同地區的許多設備上運行。為了使應用程序更具交互性,應用程序應該處理以適合應用程序將要使用的語言環境方面的文字,數字,文件等。在本章中,我
可以顯示在的Android任務,通過加載進度條的進展。進度條有兩種形狀。加載欄和加載微調(spinner)。在本章中,我們將討論微調(spinner)。Spinner 用
Android應用程序可以在許多不同地區的許多設備上運行。為了使應用程序更具交互性,應用程序應該處理以適合應用程序將要使用的語言環境方面的文字,數字,文件等。在本章中,我
JSON代表JavaScript對象符號。它是一個獨立的數據交換格式,是XML的最佳替代品。本章介紹了如何解析JSON文件,並從中提取所需的信息。Android提供了四個