這個章節描述怎麼實現一個基本的Android介面。它涉及構建螢幕基本元素,怎麼在xml(定義檔案)內定義螢幕、用你的代碼產生、在不同任務你需要操作你的使用者介面。Android產生螢幕有三種方式:xml配置產生;通過你自己使用者介面介面產生;直接用代碼產生。根據MVC原則,UI應該與程式邏輯相分離,因此,在XML中定義UI結構是高度推薦的。此外,一個程式從一個螢幕方案調整到另一個也容易得多。在XML中定義UI跟建立一個普通的HTML文檔非常相似,例如,你有如下的一個檔案:
<html>
<head>
<title>Page Title</title>
</head>
<body>
The content of the body element.
</body>
</html>
就如Android的XML布局一樣,所有的元素都是結構化的,能夠通過樹形結構來表示:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android=http://schemas.android.com/apk/res/android
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World"/>
</LinearLayout>
3.2.1螢幕元素的層次 Android應用程式的基礎功能單元就是Activity--android.app.Activity類中的一個對象。一個Activity可以做很多事,但是他自己並不會顯示到螢幕上。想要讓你的Activity顯示在螢幕上並且設計它的UI,你需要使用view和viewgroup--Android平台基礎的使用者介面表達單元。
Views
一個view是一個android.view.View基礎類的對象。它是一個儲存有螢幕上特定的一個矩形內布局和內容屬性的資料結構。一個View對象處理測距和布局,繪圖,焦點變換,捲軸,還有螢幕地區自己表現的按鍵和手勢。
View類作為一個基類,為widget(表單組件)服務,widget--是一組用於繪製互動螢幕元素的完全實現子類。Widget處理它們自己的測距和繪圖,所以你可以更快速地用它們去構建你的UI。可用到的widget包括Text,EditText,InputMethod,Button,RadioButton,Checkbox,和ScrollView……。
Viewgroups
一個ViewGroup是一個android.view.Viewgroup類的對象。正如同它的名字表明的一樣,一個viewgroup是一個特殊的view對象,它的功能是去裝載和管理一組下層的view和其他viewgroup,Viewgroup讓你可以為你的UI增加結構並且將複雜的螢幕元素構建成一個獨立的實體。
Viewgroup類作為一個基類為layout(布局)服務,layout--是一組提供螢幕介面通用類型的完全實現子類。layout讓你可以為一組view構建一個結構。
一個樹形結構的介面
在Android平台上,你用view樹和viewgroup節點來定義一個Activity的UI,就如同下面圖表一樣。這個樹可以如你需要那樣簡單或者複雜,並且你可以使用Android的預定義widget和layout或者你自訂的view類型來構建它。
一個view和viewgroup樹的範例:
Picture 4 Android UI - Tree structure
要將螢幕綁定一個樹以便於渲染,你的Activity調用它的setContentView()方法並且傳遞一個參數給根節點對象。一旦Android系統獲得了根節點的參數,它就可以直接通過節點來無效化,測距和繪製樹。當你的Activity被啟用並且獲得焦點時,系統會通知你的activity並且請求根節點去測距並繪製樹,根節點就會請求它的子節點去繪製它們自己,同時,每個樹上的viewgroup節點負責繪製它的直接子節點。
正如之前提到的,每個view group都有測量它的有效空間,布局它的子物件,並且調用每個子物件的Draw()方法去繪製它們自己。子物件可能會請求獲得一個它們在父物件中的大小和位置,但是父物件對於每個子物件的大小和位置有最終的決定權。
LayoutParams:一個子物件如何指定它的位置和大小
每個viewgroup類都會使用一個繼承於Viewgroup.LayoutParams的嵌套類。這個子類包含了一系列的屬性類型,這些屬性類型定義一個子物件位置和大小,與view group類相適應。
layoutparams的一個範例:
要注意的是,每個LayoutParams子類都有它自己賦值的文法。每個子項目必須定義適用於它們父物件的LayoutParams,儘管父物件可能會為子項目定義不同的LayoutParams。
所有的viewgroup都包括寬和高。很多還包括邊界的定義(margin和border)。你可以非常精確地描述寬和高,儘管你並不想經常這麼做。更多時候你希望你的view自行調整到適應內容大小,或者適應容器大小。
Android 介面元素與Swing介面元素的比較
Android 介面元素
Swing 介面元素
Activities
Frame
Views
Components
TextViews
Labels
EditTexts
TextFields
Buttons
Buttons
Android和Swing的監聽者設定也幾乎一樣:
3.2.2 通用布局對象下面為在你的應用中為最普遍的view groups。這裡介紹每種類型的一些基本資料;更深入的細節,請看每章前面的連結參考頁。
FrameLayout
FrameLayout是最簡單的一個布局對象。它被定製為你螢幕上的一個空白備用地區,之後你可以在其中填充一個單一對象 — 比如,一張你要發布的圖片。所有的子項目將會固定在螢幕的左上方;你不能為FrameLayout中的一個子項目指定一個位置。後一個子項目將會直接在前一個子項目之上進行覆蓋填充,把它們部份或全部擋住(除非後一個子項目是透明的)。
LinearLayout
LinearLayout以你為它設定的垂直或水平的屬性值,來排列所有的子項目。所有的子項目都被堆放在其它元素之後,因此一個垂直列表的每一行只會有一個元素,而不管他們有多寬,而一個水平列表將會只有一個行高(高度為最高子項目的高度加上邊框高度)。LinearLayout保持子項目之間的間隔以及互相對齊(相對一個元素的靠右對齊、中間對齊或者靠左對齊)。