Android程序的圖像用戶界面使用一個層級結構View和ViewGroup對象構成。View對象一般是button或者text field這些UI部件,ViewGroup對象是不可見的視圖容器,定義了子視圖的布局,比如一個網格布局或者一個垂直列表。
Android 提供一個XML詞匯表對應View和ViewGroup的子類,所以你可以在XML中使用層次結構的UI元素來定義你的UI。
上圖顯示了ViewGroup是怎麼組成布局的分支和包含其他View對象的。
在這一個課程中,你將學習使用XML創建一個包含一個文本域和一個按鈕的布局。再下一個課程,你將學習響應按鈕點擊事件,並且發送文本域中的信息給另外一個activity。
創建一個線性布局
--------------------------------------------------------------------------------
打開res/layout文件夾中的activity_main.xml文件。
提示:在Eclipse中,當你打開一個布局文件時,首先顯示的是圖像化布局編輯器,這是一個所見即所得的編輯器。這個課程我們直接編輯XML,所以點擊activity_main.xml 選項卡,打開XML編輯器。
BlankActivity模板默認創建的activity_main.xml文件使用RelativeLayout作為根視圖,一個TextView作為子視圖。
首先,刪除<TextView>元素,把<RelativeLayout>元素改成<LinearLayout>。然後添加android:orientation屬性,並設置值為"horizontal"。結果如下:
LinearLayout是一個視圖組(ViewGroup的子類),它使用水平或者垂直的方式排列它的子視圖,通過android:orientation屬性設置。LinearLayout的子視圖安裝XML中出現的順序顯示在屏幕中。
另外兩個屬性,android:layout_width和android:layout_height是所有的視圖必須有的,用來指定視圖的尺寸。
因為LinearLayout是根視圖,所以我們設置寬和高為"match_parent"讓它填滿整個屏幕,這個值的意思就是擴展這個視圖的寬和高,直到匹配它的父視圖的寬和高。
增加一個文本域
--------------------------------------------------------------------------------
在<LinearLayout>中添加一個<EditText>元素去創建一個用戶可編輯的文本域。
和每個View對象一樣,你需要定義某些XML屬性去指定EditText對象的特征。下面是你需要在<LinearLayout>中要聲明的:
關於這些屬性:
android:id
為視圖提供一個唯一的標識,你可以在代碼中通過這個標識引用這個對象,比如讀取和操縱對象。(你會在下一個課程中看到)
當你要從XML中引用資源對象時,@符號是必須的,它後面跟著資源類型,一個斜線,然後是資源的名稱。
當你第一次定義一個資源ID的時候,在資源類型前加一個+號是必須的。當你編譯程序時,SDK工具會使用這個ID名稱在項目中的gen/R.java文件中創建一個新的資源ID,這個新的資源ID引用對應的EditText元素。一旦使用這個方法聲明了資源ID,使用這個ID的使用就不需要加號了。使用加號僅僅是在指定一個新的資源ID時是必須的,對於實體資源來說不是必須的,比如字符串或者布局。
android:layout_width和android:layout_height
這裡使用"wrap_content"代替具體的寬高值來指定視圖的大小,意思是和填充這個視圖的內容一樣大。如果你使用"match_parent"的話,EditText會填滿整個屏幕,因為它會和它的父視圖LinearLayout一樣大。更多信息可以查看Layouts。
android:hint
這個屬性的值會在文本域為空的時候顯示。這裡使用"@string/edit_message"代替一個固定的字符串,它的值在一個單獨的字符串資源文件中定義。因為使用的是實體資源(不僅僅是標示符),所以不需要加號。當然,因為你還沒有定義一個字符串資源,所以你會看到一個編譯錯誤。下面章節我們會定義一個字符串資源。
提示:這個字符串資源和元素ID使用了相同名稱:edit_message,不過,引用資源的時候會通過資源類型定義作用域(比如id或者string),所以使用相同的名稱不會造成沖突。