Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android 4.0 開發者指南(27) —— Resource Types - String

Android 4.0 開發者指南(27) —— Resource Types - String

編輯: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 &lt;b>%2$d new messages&lt;/b>.</string>

</resources>

在這個格式化字符串裡,加入了一個<b>元素。注意左尖括號是用標記&lt轉義過的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);

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved