《Android Dev Guide》系列教程8:用戶界面
懶骨頭(http://blog.csdn.com/iamlazybone)
用戶界面
在一個Android應(yīng)用程序里,用戶接口是一系列的View和ViewGroup對象組合而成。Android有很多種View和ViewGroup對象,他們都繼承自View基類。
View對象是Android平臺用戶接口的基本對象。這些view類作為與用戶交互的widgets小部件的父類,像文本框和按鈕。ViewGroup作為提供各種布局結(jié)構(gòu)的layouts的父類,例如linear線性布局,表格布局和絕對布局。
一個view對象是一個數(shù)據(jù)結(jié)構(gòu),他存儲布局參數(shù)和屏幕特定區(qū)矩形區(qū)域的內(nèi)容。一個view會處理自己所在屏幕區(qū)域的測量、布局、繪制、焦點改變、滾動、和按鍵手勢交互。作為用戶交互對象,一個view可以作為用戶與系統(tǒng)的交互工具,接收事件。
View 結(jié)構(gòu)體系
在Android平臺,你要用到View或ViewGroup的層、節(jié)點的方式來定義一個Android用戶界面,就像下面的圖表,這個層次結(jié)構(gòu)樹可以按你的需求變得簡單或者復(fù)雜。你可以用Android系統(tǒng)已經(jīng)定義好的小控件或者布局,或者自定義一些。
為了能讓你的view層次結(jié)構(gòu)在屏幕上渲染,你的activity需要調(diào)用setContentView()方法并且傳遞一個根節(jié)點對象的引用。Android系統(tǒng)接收這些配置,并使用他們來進行測量繪制這個樹形的視圖結(jié)構(gòu)。這個視圖結(jié)構(gòu)的根節(jié)點要求他的孩子節(jié)點自我繪制,反過來說,每個viewGroup節(jié)點負(fù)責(zé)讓他們的子節(jié)點自我繪制。子節(jié)點會在父節(jié)點哪里請求到尺寸和位置,但父對象會最終決定他們孩子有多大。Android按順序解析你的布局上的所有元素,從頂端開始,實例化view并且把他們添加到父對象。因為他們都是按順序被繪制的,如果某些view超出的顯示范圍,那么后來繪制的將會覆蓋原來的。
關(guān)于view結(jié)構(gòu)體系怎樣繪制,在后面會有詳細的討論。
布局
通常最多的布局是通過xml來定義。xml提供一個容易閱讀的結(jié)構(gòu),很像html。xml中每個元素都是一個view或者viewGroup對象(或他們的子類)。view在樹結(jié)構(gòu)中是葉子節(jié)點,ViewGroup對象在非葉子節(jié)點(樹枝節(jié)點,參考上圖)。
xml元素名代表著各個類。比如<TextView>元素會創(chuàng)建一個TextView控件,一個<LinearLayout>會創(chuàng)建一個LinearLayout的viewGroup,當(dāng)你加載一個布局資源,Android系統(tǒng)會初始化運行時對象,即對應(yīng)的布局元素。
例如,一個簡單的垂直布局,里面包含一個textView和一個Button。
注意,linearLayout元素包含著TextView和Button。你可以嵌套另外的LinearLayout,來增加view的長度,或者增加一個更復(fù)雜的布局。
更多關(guān)于UI布局的信息,請參考 Declaring Layout章節(jié)。
你可以在你的布局里用很多種布局方式,使用很多不同類型的viewGroup,你可以定義無限多的子view或者子viewGroup。android提供一些預(yù)先定義好的布局,包括:LinearLayout-線性布局, RelativeLayout-關(guān)系布局, TableLayout-表格布局, GridLayout 網(wǎng)格布局等。他們提供一些獨特的參數(shù)用來定義view的位置和布局結(jié)構(gòu)。
Widgets小部件
widget是一個服務(wù)于用戶與界面交互的view對象。Android提供很多視圖小部件,如按鈕、尋則狂、文本輸入框、到呢個,你可以很快的構(gòu)建自己的布局。一些小部件很復(fù)雜,像日期選擇器,一個時鐘,縮放控制。但你不會被Android平臺所提供的UI部件所限制,你可以自定義UI部件,可以繼承或者結(jié)合已經(jīng)存在的UI部件。
UI事件
一旦你向界面添加了view或者widget,你可能會想他們怎樣與用戶進行交互的,這樣你就可以執(zhí)行一些操作。添加UI事件,你需要做兩件事情:
@ 定義事件監(jiān)聽器并注冊給view。
多半情況下,這就是你怎樣監(jiān)聽事件:view 類包含了一些名如OnXXXListener的監(jiān)聽器,他們都有名為OnXXX()的回調(diào)方法。例如:View.onClickListener(這是處理點擊事件的),View.onTouchListener(處理觸摸事件),View
.onKeyListener(處理按鍵事件),所以如果你想讓view響應(yīng)點擊事件,比如按鈕被選中,你需要實現(xiàn)OnClickListener接口并且定義回調(diào)方法,并且用setOnClickListener()方法來注冊View。
@ 覆蓋一個已經(jīng)存在的回調(diào)方法:
如果你失信了自己的View類并且想要監(jiān)聽一些特殊的事件,那你應(yīng)該用這種方法。例如,你可以處理屏幕觸摸事件,處理滾動球事件,按鍵等事件。它允許你定義默認(rèn)的事件,即自定義的view的每個事件,確定這個時間是否會傳遞到一些字view。然后,他們調(diào)用view類的回調(diào)函數(shù),所以當(dāng)你自定義一個組件時才有機會用到這種方法。
菜單Menu
應(yīng)用程序菜單是UI的另一個很重要的部分。Menu提供一些可靠的借口來展示程序的功能和一些設(shè)置。通常menu是通過按menu鍵才顯示的。然而,你可以讓用戶按下或者按住某一項時顯示menu菜單。
menu菜單也遵循view的層次結(jié)構(gòu),但不要自己定義。取而代之的是,你只需為你的activity定義onCreateOptionsMenu()和onCreateContextMenu()兩個回調(diào)方法即可,在適當(dāng)?shù)臅r間,Android會自動的繪制必要的視圖結(jié)構(gòu)并且menu的所包含的子項的。
Menu會處理他自己的時間。所以不需要注冊事件監(jiān)聽器,當(dāng)menu中的某一項被選中,系統(tǒng)會調(diào)用onOptionsItemSelected()方法或者onContextItemSelected()方法。
和應(yīng)用程序的布局很像,你可以用xml來配置你的menu項。
高級特征
一旦你了解了創(chuàng)建用戶界面的基本原則。你可以瀏覽一些高級特征來創(chuàng)建更復(fù)雜的應(yīng)用程序接口。
適配器Adapters
一些時候,你不想用“硬代碼”來填充一些view的數(shù)據(jù),相反,你想讓view綁定額外的數(shù)據(jù)集。要這樣的話,你要定義一個AdapterView,每個子View里的數(shù)據(jù)都會被適配器填充。
適配器視圖對象 AdapterView是實現(xiàn)的ViewGroup接口,子類是由被給出的適配器對象決定的。適配器就像你的adapter視圖和數(shù)據(jù)源之間的適配器。這里有幾種適配器類的實現(xiàn)方式,對于特殊的任務(wù),例如自定義的適配器從一個Cursor來讀取數(shù)據(jù)庫的數(shù)據(jù),或者一耳光數(shù)組適配器從任意一個數(shù)組讀取數(shù)據(jù)。
風(fēng)格和主題 Styles、Themes
你或許不滿意標(biāo)準(zhǔn)控件的外觀,你可以定制他們的風(fēng)格和主題來改變他們。
@ 一個style是一個格式化的屬性集,你作為布局的其中一個單元來使用他們。例如,你可以定義某些文本的文字大小和顏色作為特殊的view元素。
@ 一個theme主題是應(yīng)用程序中整個activity的個格式化的屬性集。例如,你可以定義窗體的邊框和面板的背景,并且設(shè)置menu的字體大小和顏色。它可以應(yīng)用在整個程序里。
風(fēng)格和主題屬于資源。Android提供一些默認(rèn)的風(fēng)格和主題資源來讓你使用?;蛘吣阋部梢宰约憾ㄖ扑麄儭?/p>