- Android應用開發教程(第2版)
- 羅文主編
- 3786字
- 2021-10-27 15:03:56
2.2 其他資源

05 其他資源
本節在程序界面的下端設計兩個菜單,一個為“文件”菜單,包含“新建”和“存盤”兩個命令,另外一個為“編輯”菜單,包含“復制”“剪切”“粘貼”命令。希望程序可以自適應手機的語言設置,當將手機的語言環境設置為英文時,顯示英文界面,設置為中文時顯示中文界面。
2.2.1 Drawable資源
Drawable資源是Android中使用最多的資源,不僅可以直接使用圖片作為資源,而且可以使用多種XML文件作為資源。只要這個XML文件可以被系統編譯成Drawable子類的對象,那么這個XML文件就可以作為Drawable資源。本書只涉及兩個子類:圖片資源和StateListDrawable資源,其他的子類資源請參考Android API。
(1)圖片資源
Android中不僅可以將擴展名為.png、.jpg、.gif的普通圖片作為圖片資源,而且可以將擴展名為.9.png的9-Pach圖片作為圖片資源。9-Pach圖片是使用Android SDK中提供的編輯工具生成的。9-Pach圖片其實就是一張基于自動適應內容大小而伸縮顯示區域的PNG圖片(.9.png),其原理是將圖片的四個角獨立出來,這樣整個圖片可以按照九宮格進行分解,使得縮放時效果較好。Android會自動調整九宮格的大小來容納顯示的內容。
Android中的圖片資源被稱為Drawable資源,可以依據圖片的分辨率的不同,將圖片放在項目res目錄下的幾個drawable-xxx文件夾中,如表2-4所示。
表2-4 不同分辨率的圖形資源

與其他資源一樣,圖片放置成功后,Android自動在R.java文件中維護其索引值。開發人員即可在Java代碼和XML文件中訪問該圖片資源。在Java中訪問圖片資源的語法形式是:[<package>.]R.drawable.<文件名>,如下面的代碼所示。

在XML文件中訪問圖片資源的語法形式是:@[<package>:]drawable/文件名,如下面的代碼所示。

(2)StateListDrawable資源
StateListDrawable資源是定義在XML文件中的Drawable對象,能根據組件的狀態來呈現不同的圖像。例如一個Button按鈕存在多種不同的狀態(pressed、enabled、focused等),使用StateListDrawable資源可以為按鈕的每個狀態提供不同的按鈕圖片。
StateListDrawable資源同圖片資源一樣,也是放在項目的res\drawable-xxx目錄中,StateListDrawable資源文件的根元素是<selector></selector>,在該元素中可以包含多個<item></item>元素。每個item元素可以設置以下兩個屬性。
? android:color或android:drawable:用于指定顏色或Drawable資源。
? android:state_xxx:用于指定一個特定的狀態。
StateListDrawable資源常用的狀態屬性如表2-5所示。
表2-5 StateListDrawable資源常用的狀態屬性

例如創建一個StateListDrawable資源(就是普通的Android XML文件),根元素使用selector,文件名為edittext_focused.xml,創建完以后把文件保存到res\drawable-mdpi文件夾下,代碼如下。

接著在布局文件中引用上面定義的樣式。

運行效果如圖2-7所示,當文本框獲得焦點時,文字變為高亮顯示。

圖2-7 StateListDrawable資源效果
2.2.2 數組資源
如果想在Android中管理大量類型相同的有關聯的數據,可以采用數組。Android不推薦在Java代碼中定義數組,而是推薦使用數組資源文件的方式來定義數組。
數組資源文件位于項目的res\values目錄下,根元素是<resources></resources>標記,在該元素中可以包含以下3類子元素。
? <array/>:用于定義普通類型的數組。
? <integer-array/>:用于定義整數數組。
? <string-array/>:用于定義字符串數組。
每一種子元素都可以使用name屬性定義數組名稱,并且在起始標記和結束標記中間使用<item></item>標記定義數組中的元素。例如定義一個包含兩個數組的文件代碼如下。


數組元素定義完成后,就可以在Java代碼或XML中使用數組資源了。在Java代碼中使用數組資源的語法形式是:[<package>.]R.array.數組名,例如以下代碼使用前面創建的字符串數組city:

在XML文件中使用數組資源的語法形式是:@[<package>:]array/數組名,例如在XML布局文件中為ListView指定列表項的代碼示例:

2.2.3 菜單資源
Android推薦在一個XML菜單資源文件中定義菜單而不是在代碼中定義,然后在代碼中使用這個菜單資源。使用菜單資源來定義菜單是一個很實用的做法,因為這樣可以使界面與代碼分離,并且在XML中更容易設計菜單。
菜單資源文件通常放置在項目的res\menu目錄下,在創建項目時,默認沒有創建menu目錄,開發人員需要創建這個目錄。菜單資源的根元素是<menu></menu>,在該標記中可以包含一個或多個以下的兩種元素之一。
<item></item>:用于定義一個菜單項。菜單項中可以嵌套<menu>元素,此時它就擁有子菜單了。<item>元素常用屬性如表2-6所示。
表2-6 <item>元素常用屬性

(續)

<group></group>:一個可選的、不可見的、容納<item>元素的容器。<group>元素能夠對菜單項進行分組,從而使同組的菜單項共享一些屬性,比如活動狀態、可見狀態等。<group>元素常用屬性如表2-7所示。
表2-7 <group>元素常用屬性

如下代碼定義了一個菜單資源文件test_menu.xml,其中定義了一個包含兩個子菜單的項和一個包含三個菜單項的菜單組。

定義菜單資源文件后,即可在Java代碼中使用這個菜單資源,這里以選項菜單和上下文菜單的創建方法為例說明菜單的使用。
(1)選項菜單(Option Menu)
選項菜單是最常見的菜單。當用戶單擊設備上的菜單(Menu)按鍵時,彈出的就是選項菜單。定義好菜單資源文件后,重寫Acitivity的onCreateOptionsMenu()方法。具體的重寫步驟是首先創建一個解析菜單資源文件的MenuInflater對象,然后調用該對象的inflate()方法解析一個菜單資源文件,并把解析后的菜單保存在menu中,如下代碼所示。

接著重寫onOptionItemSelected()方法,用于當菜單項被選擇時做出相應的處理,如以下代碼所示。

(2)上下文菜單(Context Menu)
Android中長按視圖中的某個組件后彈出的就是上下文菜單。定義好菜單文件后,首先在Activity的onCreate()方法中注冊上下文菜單。例如,為文本框組件注冊上下文菜單,也就是在長按文本框組件時顯示的菜單,代碼如下。

重寫項目中Activity的上下文菜單回調方法:onCreateContextMenu()。首先創建一個用于解析菜單資源文件的MenuInflater對象,然后MenuInflater調用inflate()方法解析一個菜單資源(也可以使用add()來添加菜單項),并將解析結果保存在menu中,可以為菜單設置圖標和標題等信息,如下代碼所示。

當用戶從上下文菜單中選擇一個菜單項時,系統會調用方法onContextItemSelected(),所以需要重寫此回調方法,如下代碼所示。


這些代碼與前面選項菜單的示例代碼基本相同。getItemId()從所選的菜單項獲取菜單ID,并且使用switch語句匹配菜單ID與對應的處理,default語句調用父類的同一方法處理未被代碼處理的菜單項。
2.2.4 資源自適應
為了讓應用程序自適應手機上不同的語言環境,比如在英文環境中顯示英文菜單,在中文環境中顯示中文菜單,需要對于界面的字符串進行處理,實際就是為應用程序提供不同語言的相應字符串信息。開發人員需要做的是為各種語言的字符串資源建立文件,然后將相應的同名資源放到這些文件中。程序在使用時,系統會根據環境的語言設置自動選擇對應語言的字符串定義作為對應的顯示內容。
例如先在項目的values目錄下建立一個名為string.xml的資源文件,定義一個字符串資源,代碼如下。

右擊values目錄,在彈出的快捷菜單中選擇“New”→“Values resource file”命令,在隨后彈出的“New Resource File”對話框中輸入文件名,建議對同類資源使用同一名稱,在“Available qualifiers”列表框中選擇“Locale”(本地化),單擊中間的按鈕。然后在出現的“Language”列表框和“Specific Region Only”列表框中選擇所需的信息,如圖2-8所示。

圖2-8 本地化資源設置
這樣系統就會根據所選的語言和區域建立資源文件。將之前資源文件中的字符串資源復制到當前文件中,文件中對于同名字符串賦予所需語言的字符串內容,這里以中文為例,代碼如下。

項目在Android瀏覽模式下的values目錄變成如圖2-9所示的形式,在項目的project瀏覽模式下可見對應的文件夾結構如圖2-10所示。系統添加了values-zh-rCN文件夾,該資源的命名規則是:資源目錄+配置選項。其中,資源目錄是指項目的res目錄中的子目錄,例如values、layout等;配置選項包含很多部分,中間用“-”分隔。例如,不同語言和地區對應的配置選項包括語言代號和地區代號。

圖2-9 Android瀏覽模式下的資源目錄

圖2-10 Project瀏覽模式下的資源目錄
例如,表示中文和中國的配置選項是zh-rCN,表示英文和美國的配置選項是en-rUS。其中zh和en分別表示中文和英文,CN和US表示中國和美國,前面的r字符是必需的。
這樣程序在運行時,如果設置的是英文環境,系統就會輸出英文的字符串內容,如果設置的是中文環境,系統就會輸出中文的字符串內容。
其他的資源目錄也可以采用同樣的方式處理類似的問題。
2.2.5 實例2:定制菜單
1.新建項目,設置資源
在AS中新建項目,應用程序取名“定制菜單”,項目名稱命名為“ch02_02”,首先配置字符串資源,新建菜單資源。
(1)設置字符串資源
打開strings.xml,增加菜單所需的字符串,并修改內容如下。

要實現根據手機的語言設置自動調整語言,需要建立所需語言的資源文件,下面以菜單的中英文切換為例進行演示。
在value文件夾上右擊,新建一個資源文件,同樣命名為strings.xml,在向導中選擇語言為chinese,區域選擇為CN,單擊“OK”按鈕,可以看到在values下創建了一個新文件,雙擊新建的strings.xml,調整內容如下。

這兩個字符串資源文件中的字符串的名字相同,但是值卻是對應的英文和中文的不同版本。
(2)新建菜單資源
默認情況下,res目錄下沒有menu文件夾,右擊res文件夾,在彈出的快捷菜單中選擇“New”→“Android Resource Directory”命令,在向導中的“Resource Type”下拉列表中選擇“menu”選項,單擊“OK”按鈕,系統自動在res目錄下建立一個menu文件夾。在剛建立的menu文件夾上右擊,選擇“New”→“Menu rescource file”命令,在彈出窗口中輸入文件名“filemenu”,單擊“OK”按鈕,可以看到res目錄的情況如圖2-11所示。

圖2-11 新增菜單資源文件
雙擊打開filemenu文件,在Design視圖模式下,可以在Palette中選擇所需菜單項,添加到Compoment Tree中,新的菜單層次結構如圖2-12所示。

圖2-12 新的菜單層次結構
選中“Item”菜單項,在右側的屬性部分修改“title”,選擇之前建立的字符串資源作為顯示的標題文字。也可以在Text模式下,直接編輯菜單的XML文件。最終生成的菜單源代碼如下。

2.代碼實現
最后就是調整源代碼,顯示新的菜單。雙擊java\com.example.ch02_02下的MainActivity.java文件,在文件的onCreate方法后中增加如下方法代碼。

在模擬器中運行時,調整模擬器當前語言設置為英文,單擊本應用右上角的菜單按鈕,即可看到如圖2-13所示的菜單,選擇“File”菜單項可以看到如圖2-14所示的英文子菜單。

圖2-13 英文菜單的顯示

圖2-14 英文子菜單
調整模擬器當前語言設置為中文,運行程序,單擊本應用右上角的菜單按鈕,即可看到如圖2-15所示的菜單,選擇“文件”菜單項可以看到如圖2-16所示的中文子菜單。

圖2-15 中文菜單的顯示

圖2-16 中文子菜單的顯示