Android應(yīng)用程序開發(fā) 課件 第9章 Android界面編程_第1頁
Android應(yīng)用程序開發(fā) 課件 第9章 Android界面編程_第2頁
Android應(yīng)用程序開發(fā) 課件 第9章 Android界面編程_第3頁
Android應(yīng)用程序開發(fā) 課件 第9章 Android界面編程_第4頁
Android應(yīng)用程序開發(fā) 課件 第9章 Android界面編程_第5頁
已閱讀5頁,還剩84頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第9章Android界面編程本章簡介對于Android應(yīng)用開發(fā)而言,界面編程尤為重要。設(shè)計良好的UI界面不僅能夠增強(qiáng)用戶使用軟件的粘性,而且還有利于用戶在人機(jī)對話中更好地與應(yīng)用邏輯交互。Android為應(yīng)用程序開發(fā)提供了豐富多彩的UI控件,合理地將這些組件搭配在一起就能夠開發(fā)出美觀、漂亮的圖形用戶界面。本章將詳細(xì)介紹Android中基本UI控件的知識,并通過具體實例的實現(xiàn)過程講解各個控件的使用方法,為讀者學(xué)習(xí)本書后面的知識打下堅實的基礎(chǔ)。本章目錄9.1UI控件簡介9.2布局管理器9.3列表視圖(ListView)9.4常用widget組件9.5菜單(Menu)9.6活動欄(ActionBar)9.7對話框(Dialog)9.8小結(jié)9.9習(xí)題9.1UI控件簡介Android的UI控件建立在視圖(View)和視圖容器(ViewGroup)這兩個類的基礎(chǔ)之上。View類是所有UI控件的父類,而ViewGroup則通常作為容器管理各種UI控件。AndroidSDK采用了“組合器”設(shè)計模式來組織圖像用戶界面:既可以使用ViewGroup包裹若干個獨立的視圖控件,又可以將ViewGroup作為一個普通的視圖控件來使用。圖9-1是AndroidUI界面的組件層次。9.1.1ViewView類是Android界面編程中使用到的基礎(chǔ)UI類。幾乎所有的高級UI控件(例如:TextView、Button和EditText等)都是從View類繼承而來的。一個視圖(View)占用屏幕中的一塊矩形區(qū)域,并負(fù)責(zé)渲染這塊區(qū)域。此外,View類控件還能夠處理矩形區(qū)域內(nèi)發(fā)生的各種事件,設(shè)置矩形區(qū)域是否可見,并且可單獨設(shè)置它能否獲得用戶輸入焦點等等。在設(shè)計Android應(yīng)用的UI界面時,通常會采用在XML布局文件中設(shè)置標(biāo)簽屬性值的方法控制UI控件的外觀。表9-1列出了View類控件常用的一些設(shè)置屬性。9.1.2ViewGroupViewGroup類是一個從View類繼承而來的抽象類,它經(jīng)常作為各種高級UI控件的容器類來使用。在ViewGroup中,使用ViewGroup.LayoutParams和ViewGroup.MarginLayoutParams這兩個內(nèi)部類來控制UI控件在容器內(nèi)的布局。表9-2列出了可由ViewGroup.LayoutParams類設(shè)置的控件屬性。表9-3則列出了可由ViewGroup.MarginLayoutParams類設(shè)置的控件屬性。9.1.3使用XML布局文件控制UI界面Android推薦使用XML布局文件設(shè)計UI界面。這種方法充分體現(xiàn)了MVC設(shè)計模式的優(yōu)點,它不僅簡單、明了,而且還能夠很好將應(yīng)用程序的視圖控制邏輯從Java代碼中分離出來。當(dāng)在Android應(yīng)用的app\src\main\res\layout目錄下創(chuàng)建XML布局文件后,全局變量R.layout將自動收錄該布局資源。Java代碼可使用下述方法為Activity指定UI界面。

Activity.SetContentView(R.layout.<XML布局文件名>);當(dāng)在布局文件內(nèi)添加完成UI控件標(biāo)簽后,應(yīng)為其設(shè)置android:id屬性。Android系統(tǒng)將使用android:id屬性值作為UI控件在應(yīng)用程序的唯一標(biāo)識。Java代碼可使用下述方法獲取指定的UI控件。

Activity.FindViewById(R.id.<android.id屬性值>);當(dāng)成功獲取UI控件之后,就能夠使用Java代碼靈活地對UI控件的外觀和行為進(jìn)行控制了。需要注意的是,XML布局文件并不是控制UI界面的唯一方式。Android也支持完全拋棄XML布局文件,僅僅使用Java代碼的方式控制UI界面。甚至,還可使用XML布局文件與Java代碼混合編程的方法來控制UI界面。9.2布局管理器Android的UI界面往往包含很多控件,在進(jìn)行界面編程時應(yīng)首先考慮這些控件的整體擺放方式??刹捎镁帉慗ava代碼的方法控制UI控件在界面中的擺放位置和大小。但是,這種方法會在很大程度上增加界面編程的復(fù)雜性。此外,當(dāng)顯示屏幕的分辨率發(fā)生變化時還需要UI界面進(jìn)行額外適配。為提高界面編程的效率,Android提供了一系列的布局管理器。這些布局管理器可以按照不同的規(guī)律整齊地控制UI控件在界面中的顯示位置。圖9-2是AndroidSDK中布局管理器的層次結(jié)構(gòu)。從該層次關(guān)系可以看出,Android提供了六種不同類型的布局管理器來組織界面中的不同控件,這些布局管理器均派生自ViewGroup這一抽象的父類。在各個布局管理器中均實現(xiàn)了父類的addView()方法,可使用該方法為布局管理器添加UI控件。9.2.1線性布局線性布局(LinearLayout)將它包裹的所有UI控件沿顯示屏幕水平或豎直方向依此排列。表9-4給出了線性布局經(jīng)常使用到的一些XML屬性??墒褂孟率龃a定義一個線性布局,并向該布局添加三個按鈕控件,設(shè)定這些控件在布局內(nèi)沿豎直方向排列。<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"xmlns:tools="/tools"android:id="@+id/activity_main"tools:context="com.example.zsp.linearlayoutdemo.MainActivity"

android:orientation="vertical"

android:layout_width="match_parent"

android:layout_height="match_parent">

<Buttonandroid:id="@+id/button1"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="按鈕1"/><Buttonandroid:id="@+id/button2"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="按鈕2"/><Buttonandroid:id="@+id/button3"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="按鈕3"/></LinearLayout>代碼解釋粗體標(biāo)記的代碼給出了線性布局的設(shè)置方法。在<LinearLayout>標(biāo)簽內(nèi),可將android:orientation的屬性值設(shè)置為"vertical",控制布局內(nèi)的所有控件沿豎直方向依此排列;此外,還可將android:layout_width和android:layout_height的屬性值設(shè)置為"match_parent",控制將線性布局的寬度和高度填滿整個屏幕。編譯并運(yùn)行程序,可以看到布局內(nèi)的按鈕控件全部沿豎直方向自上向下整齊排列,如圖9-3所示。可修改下述用粗體字標(biāo)記的代碼,將線性布局內(nèi)控件的排列方向修改為水平方向。<LinearLayoutxmlns:android="/apk/res/android"xmlns:tools="/tools"android:id="@+id/activity_main"tools:context="com.example.zsp.linearlayoutdemo.MainActivity"

android:orientation="horizontal"android:layout_width="match_parent"android:layout_height="match_parent">…</LinearLayout>重新編譯并運(yùn)行程序,可以看到布局內(nèi)的按鈕控件已全部修改為沿水平方向自左向右整齊排列,如圖9-4所示。需要注意的是,當(dāng)將線性布局的排列方向設(shè)置為vertical時,不能將布局內(nèi)子控件的高度指定為match_parent,它會使某個子控件占滿屏幕的豎直方向,而無法顯示其余控件;反之,當(dāng)將線性布局的方向設(shè)置為horizontal時,也不能將布局內(nèi)控件的寬度指定為match_parent??蛇M(jìn)一步修改線性布局,使用下述用粗體標(biāo)記的代碼,為其增加android:gravity屬性。<LinearLayoutxmlns:android="/apk/res/android"xmlns:tools="/tools"android:id="@+id/activity_main"tools:context="com.example.zsp.linearlayoutdemo.MainActivity"android:orientation="horizontal"android:layout_width="match_parent"android:layout_height="match_parent"

android:gravity="center">…</LinearLayout>重新編譯并運(yùn)行程序,可以看到沿水平向排列按鈕控件已經(jīng)被調(diào)整到了在屏幕中央顯示,如圖9-5所示。類似地,也可以嘗試為android:gravity屬性設(shè)置其它屬性值,觀察該屬性對UI控件顯示位置的影響。除了可以設(shè)置<LinearLayout>標(biāo)簽的屬性之外,還可以在子控件的標(biāo)簽內(nèi)使用android:layout_gravity屬性單獨地調(diào)整這些子控件在線性布局內(nèi)的顯示位置。<Buttonandroid:id="@+id/button1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="按鈕1"

android:layout_gravity="top"/><Buttonandroid:id="@+id/button2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="按鈕2"

android:layout_gravity="center"/><Buttonandroid:id="@+id/button3"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="按鈕3"

android:layout_gravity="bottom"/>編譯并重新運(yùn)行程序,可以看到這三個按鈕控件雖然還是沿水平向依此排列,但是通過對按鈕控件android:layout_gravity屬性的設(shè)置,它們分別被控制顯示到了屏幕的頂端、中央和底部,見圖9-6。為了使UI界面能夠自動適配不同顯示屏幕分辨率的大小,還可以在線性布局內(nèi)為UI控件標(biāo)簽增加android:layout_width和android:layout_weight屬性,使其按照一定的顯示比例進(jìn)行縮放。<Buttonandroid:id="@+id/button1"

android:layout_width="0dp"android:layout_height="wrap_content"android:text="按鈕1"android:layout_gravity="top"

android:layout_weight="1"/><Buttonandroid:id="@+id/button2"

android:layout_width="0dp"android:layout_height="wrap_content"android:text="按鈕2"android:layout_gravity="center"

android:layout_weight="2"/><Buttonandroid:id="@+id/button3"

android:layout_width="0dp"android:layout_height="wrap_content"android:text="按鈕3"android:layout_gravity="bottom"

android:layout_weight="3"/>代碼解釋首先,應(yīng)將UI控件標(biāo)簽內(nèi)的android:layout_width屬性設(shè)置為“0dp”,取消該屬性對控件寬度的設(shè)置。然后,可為UI控件增加android:layout_weight屬性,設(shè)置它對屏幕寬度的占用比例。例如:分別將這三個控件的android:layout_weight的屬性值設(shè)置為“1”、“2”、“3”,表示按照1:2:3的屏幕占用比例設(shè)置各個控件的寬度。編譯并重新運(yùn)行程序,可以看到三個按鈕控件在水平方向上以指定的比例占滿了屏幕的顯示空間,如圖9-7所示。9.2.2相對布局與線性布局相比,相對布局(RelativeLayout)更加靈活,它以相對定位的方式控制子控件在布局內(nèi)的排列位置。表9-5給出了相對布局常用的XML屬性。由于相對布局還包含了一個內(nèi)部類——RelativeLayout.LayoutParams,因此還可為相對布局內(nèi)的子控件指定表9-6所示的XML屬性。此外,也可使用到表9-7所示的XML屬性,為子控件指定相對于參考子控件的擺放位置??墒褂孟率龃a定義出一個相對布局,向該布局添加五個按鈕控件,并設(shè)定這些控件在布局內(nèi)排列規(guī)則。<?xmlversion="1.0"encoding="utf-8"?><RelativeLayoutxmlns:android="/apk/res/android"xmlns:tools="/tools"android:id="@+id/activity_main"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.example.zsp.relativelayoutdemo.MainActivity">

<Buttonandroid:id="@+id/button1"android:layout_width="wrap_content"android:layout_height="wrap_content"

android:layout_alignParentLeft="true"android:layout_alignParentTop="true"android:text="Button1"/><Buttonandroid:id="@+id/button2"android:layout_width="wrap_content"android:layout_height="wrap_content"

android:layout_alignParentRight="true"android:layout_alignParentTop="true"android:text="Button2"/><Buttonandroid:id="@+id/button3"android:layout_width="wrap_content"android:layout_height="wrap_content"

android:layout_centerInParent="true"android:text="Button3"/><Buttonandroid:id="@+id/button4"android:layout_width="wrap_content"android:layout_height="wrap_content"

android:layout_alignParentBottom="true"android:layout_alignParentLeft="true"android:text="Button4"/><Buttonandroid:id="@+id/button5"android:layout_width="wrap_content"android:layout_height="wrap_content"

android:layout_alignParentBottom="true"android:layout_alignParentRight="true"android:text="Button5"/></RelativeLayout>代碼解釋粗體標(biāo)記的代碼給出了使用相對布局?jǐn)[放UI控件的方法??蔀閁I控件的標(biāo)簽設(shè)置android:layout_alignParentBottom屬性和android:layout_alignParentBottom屬性,以控制它在布局內(nèi)的擺放位置。在示例代碼中:Button1擺放到布局的左上角,Button2擺放到布局的右上角,Button3擺放到布局中央,Button4擺放到布局的左下角,Button5擺放到布局的右下角。編譯并運(yùn)行程序,可以看到布局內(nèi)的按鈕控件已按照設(shè)定方向擺放,如圖9-8所示??蛇M(jìn)一步修改XML文件,首先設(shè)置好一個UI控件的擺放位置,然后再以該控件作為參考,放置其余UI控件。<Buttonandroid:id="@+id/button3"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:text="Button3"/><Buttonandroid:id="@+id/button1"android:layout_width="wrap_content"android:layout_height="wrap_content"

android:layout_above="@id/button3"android:layout_toLeftOf="@id/button3"android:text="Button1"/><Buttonandroid:id="@+id/button2"android:layout_width="wrap_content"android:layout_height="wrap_content"

android:layout_above="@id/button3"android:layout_toRightOf="@id/button3"android:text="Button2"/><Buttonandroid:id="@+id/button4"android:layout_width="wrap_content"android:layout_height="wrap_content"

android:layout_below="@id/button3"android:layout_toLeftOf="@id/button3"android:text="Button4"/><Buttonandroid:id="@+id/button5"android:layout_width="wrap_content"android:layout_height="wrap_content"

android:layout_below="@id/button3"android:layout_toRightOf="@id/button3"android:text="Button5"/>代碼解釋粗體標(biāo)記的代碼給出了在相對布局內(nèi)使用參考控件擺放其它控件的方法??蔀閁I控件的標(biāo)簽設(shè)置android:layout_below、android:layout_toRightOf屬性和android:layout_toLeftOf等屬性,以控制它在布局內(nèi)的擺放位置。在示例代碼中,首先將Button3放置到界面布局中央,然后再分別使用android:layout_above、android:layout_below、android:layout_toLeftOf和android:layout_toRightOf等屬性,為其它控件指定它相對參考控件——@id/button3的擺放位置。需要注意的是,在代碼中必須將參考控件放置在其它控件之前,否則將出現(xiàn)找不到參考控件引用的錯誤。重新運(yùn)行程序,如圖9-9所示,可以看到在布局內(nèi)以Button3按鈕為中心,其它按鈕分別按照配置的屬性圍繞在該按鈕周圍。9.2.3表格布局表格布局(TableLayout)是采用行和列的樣式來排列布局內(nèi)的UI控件。它無需聲明行、列數(shù)目指定布局外觀,僅需通過添加TableRow標(biāo)簽和UI控件標(biāo)簽的方法便能增加行和列。當(dāng)需要為表格增加一行時,只需為其添加一個TableRow標(biāo)簽;而TableRow也可以作為容器包裹子控件,每添加一個子控件,表格布局就增加一列。表格布局從線性布局繼承,因此線性布局所有可設(shè)置的XML屬性也可用于表格布局。此外,表格布局還可以使用表9-8所示的XML屬性??墒褂孟率龃a定義出一個表格布局,向該布局添加四個按鈕控件,并設(shè)定這些控件在布局內(nèi)排列規(guī)則。<?xmlversion="1.0"encoding="utf-8"?><TableLayoutxmlns:android="/apk/res/android"xmlns:tools="/tools"android:id="@+id/activity_main"android:layout_width="match_parent"android:layout_height="match_parent"

android:shrinkColumns="1"android:stretchColumns="2"tools:context="com.example.zsp.tablelayoutdemo.MainActivity"><Buttonandroid:id="@+id/button1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Button1"/>

<TableRow><Buttonandroid:id="@+id/button2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Button2"/><Buttonandroid:id="@+id/button3"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Button3"/><Buttonandroid:id="@+id/button4"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Button4"/>

</TableRow></TableLayout>代碼解釋粗體標(biāo)記的代碼給出了使用表格布局?jǐn)[放UI控件的方法。在示例代碼中,通過為表格布局標(biāo)簽設(shè)置android:shrinkColumns屬性指定第2列內(nèi)的UI控件可收縮以適配UI界面。同時,它也為表格布局標(biāo)簽設(shè)置android:stretchColumns屬性指定第3列內(nèi)的UI控件可拉伸以適配UI界面。此外,它還使用了<TableRow>標(biāo)簽為表格布局增加新的一行。編譯并運(yùn)行程序,可以看到表格布局將按鈕分成二行顯示:第一行單獨用一列放置Button1按鈕;第二行依此放置了正常顯示的Button2按鈕、收縮顯示的Button3按鈕和拉伸顯示的Button4按鈕,如圖9-10所示??蛇M(jìn)一步修改XML文件,為線性布局增加android:collapseColumns屬性。<TableLayoutxmlns:android="/apk/res/android"xmlns:tools="/tools"android:id="@+id/activity_main"android:layout_width="match_parent"android:layout_height="match_parent"android:shrinkColumns="1"android:stretchColumns="2"

android:collapseColumns="0"tools:context="com.example.zsp.tablelayoutdemo.MainActivity">代碼解釋粗體標(biāo)記的代碼給出了在表格布局中隱藏顯示UI控件的方法。在示例代碼中,通過為表格布局標(biāo)簽設(shè)置android:collapseColumns屬性指定隱藏第一列的所有控件。需要注意的是,android:collapseColumns屬性僅對包含有多列的表格布局有效。編譯并重新運(yùn)行程序,可看到放置在第二行第一列中的Button1已經(jīng)隱藏顯示,而Button4控件則自動拉伸占滿了整個屏幕的水平空間,如圖9-11所示。9.2.4網(wǎng)格布局網(wǎng)格布局(GridLayout)是在Android4.0版本之后新增加的布局方式。它將UI界面劃分為網(wǎng)格,可將UI控件隨意地擺放到各個網(wǎng)格單元中。網(wǎng)格布局比表格布局更加靈活,當(dāng)使用網(wǎng)格布局時,UI控件可占用多個網(wǎng)格單元;而在表格布局中,不能將UI控件跨行設(shè)置。表9-9列出了網(wǎng)格布局常用的XML屬性。由于網(wǎng)格布局還包含了一個內(nèi)部類——GridLayout.LayoutParams,因此還可為網(wǎng)格布局內(nèi)的UI控件指定表9-10所示的XML屬性??墒褂孟率龃a定義一個網(wǎng)格布局,設(shè)計出一個簡易計算器UI界面。<?xmlversion="1.0"encoding="utf-8"?><GridLayoutxmlns:android="/apk/res/android"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="wrap_content"

android:columnCount="4"android:rowCount="6"android:alignmentMode="alignBounds"tools:context="com.example.zsp.gridlayoutdemo.MainActivity"><TextViewandroid:id="@+id/text"android:layout_width="match_parent"android:layout_height="wrap_content"

android:layout_columnSpan="4"android:text="0"/><Buttonandroid:id="@+id/button1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="1"/><Buttonandroid:id="@+id/button2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="2"/><Buttonandroid:id="@+id/button3"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="3"/><Buttonandroid:id="@+id/buttonadd"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="+"/>

<Buttonandroid:id="@+id/button4"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="4"/><Buttonandroid:id="@+id/button5"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="5"/><Buttonandroid:id="@+id/button6"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="6"/><Buttonandroid:id="@+id/buttondown"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="-"/><Buttonandroid:id="@+id/button7"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="7"/><Buttonandroid:id="@+id/button8"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="8"/><Buttonandroid:id="@+id/button9"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="9"/><Buttonandroid:id="@+id/buttonelim"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="/"/><Buttonandroid:id="@+id/button0"android:layout_width="wrap_content"android:layout_height="wrap_content"

android:layout_columnSpan="2"android:layout_gravity="fill"android:text="0"/><Buttonandroid:id="@+id/buttongrade"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="="/><Buttonandroid:id="@+id/buttonride"android:layout_width="wrap_content"android:layout_height="wrap_content"

android:layout_rowSpan="2"android:layout_gravity="fill"android:text="*"/><Buttonandroid:id="@+id/buttonce"android:layout_width="wrap_content"android:layout_height="wrap_content"

android:layout_columnSpan="3"android:layout_gravity="fill"android:text="CE"/></GridLayout>代碼解釋粗體標(biāo)記的代碼給出了使用網(wǎng)格布局?jǐn)[放UI控件的方法。示例代碼使用了android:columnCount和android:rowCount屬性定義了一個六行四列的網(wǎng)格布局,并且在UI控件標(biāo)簽內(nèi)使用android:layout_rowSpan和android:layout_columnSpan屬性設(shè)置相應(yīng)控件占用的行、列個數(shù)。編譯并運(yùn)行程序,可以看到布局內(nèi)的所有UI控件已按照設(shè)定的屬性有序擺放,如圖9-12所示。9.2.5幀布局幀布局(FrameLayout)為容器內(nèi)各個UI控件創(chuàng)建一個空白的顯示區(qū)域(又稱作是一幀)。釆用幀布局方式設(shè)計UI界面時,只能在屏幕左上角顯示一個控件,如果要添加多個控件,這些控件會按照加入的順序在屏幕的左上角重疊顯示。表9-11列出了幀布局中經(jīng)常使用到的XML屬性??墒褂孟率龃a定義一個幀布局,設(shè)計出一個具有文字重影效果的UI界面。<?xmlversion="1.0"encoding="utf-8"?><FrameLayoutxmlns:android="/apk/res/android"xmlns:tools="/tools"android:id="@+id/activity_main"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.example.zsp.framelayoutdemo.MainActivity">

<TextViewandroid:id="@+id/view1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="較大"android:textSize="50pt"/><TextViewandroid:id="@+id/view2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="一般"android:textSize="20pt"/><TextViewandroid:id="@+id/view3"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="較小"android:textSize="10pt"/></FrameLayout>代碼解釋示例代碼定義了一個幀布局,它按照字體從大到小的順序向布局添加了三個文本顯示UI控件。編譯并運(yùn)行程序,可以看到文本顯示控件被固定顯示在布局的左上角,并且逐層覆蓋顯示,如圖9-13所示。9.2.5絕對布局絕對布局(AbsoluteLayout)不提供任何布局控制,而是通過指定UI控件在屏幕上顯示位置(X、Y坐標(biāo))來設(shè)置控件的擺放位置。需要注意的是,因屏幕顯示的分辨率存在較大差異,采用絕對布局開發(fā)的UI界面時,需要額外考慮不同屏幕分辨率下的適配性??墒褂孟率龃a定義一個絕對布局,設(shè)計出一個用戶登錄界面。<?xmlversion="1.0"encoding="utf-8"?><AbsoluteLayoutxmlns:android="/apk/res/android"xmlns:tools="/tools"android:id="@+id/activity_main"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.example.zsp.absolutelayoutdemo.MainActivity">

<TextView

android:layout_x="20dp"android:layout_y="20dp"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="登錄名:"/><EditText

android:layout_x="80dp"android:layout_y="15dp"android:layout_width="wrap_content"android:width="300px"android:layout_height="wrap_content"/><TextViewandroid:layout_x="20dp"android:layout_y="80dp"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="密碼:"/><EditText

android:layout_x="80dp"android:layout_y="75dp"android:layout_width="wrap_content"android:width="300px"android:layout_height="wrap_content"android:password="true"/><Button

android:layout_x="130dp"android:layout_y="135dp"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="登錄"/></AbsoluteLayout>代碼解釋粗體標(biāo)記的代碼給出了使用絕對布局?jǐn)[放UI控件的方法??稍赨I控件的標(biāo)簽內(nèi)使用android:layout_x和android:layout_y屬性為其設(shè)置屏幕上顯示的X、Y坐標(biāo)。需要注意的是,UI控件的絕對坐標(biāo)需要在界面調(diào)試時不斷地進(jìn)行調(diào)整,才能確定出理想的顯示位置。編譯并運(yùn)行程序,可以看到使用絕對布局?jǐn)[放的UI控件組合成一個簡單的用戶登錄界面如圖9-14所示。9.3列表視圖(ListView)當(dāng)手機(jī)屏幕空間有限,無法完整地將UI界面的所有內(nèi)容顯示出來時,可使用列表視圖(ListView)將屏幕外不能顯示的內(nèi)容垂直滾動到屏幕內(nèi)顯示。ListView類直接從AbsListView類繼承,它的數(shù)據(jù)項則來自一個繼承了ListAdapter接口的適配器。表9-12給出了ListView經(jīng)常用到的XML屬性。Android系統(tǒng)提供了下述經(jīng)常使用的方法來操作ListView。(1)addFooterView(Viewv)

該方法用于增加一個表尾View視圖。(2)removeFooterView(Viewv)該方法用于刪除一個表尾View視圖。(3)addHeaderView(Viewv)該方法用于刪除一個表頭View視圖。(4)removeHeaderView(Viewv)該方法用于增加一個表頭View視圖。(5)getAdapter()該方法用于獲得當(dāng)前綁定的ListAdapter適配器。(6)setAdapter(ListAdapteradapter)該方法用于為ListView設(shè)置一個ListAdapter適配器。(7)setSelection(intposition)該方法用于設(shè)定ListView顯示當(dāng)前選擇項。(8)getCheckItemIds()該方法用于獲取ListView的當(dāng)前選擇項。在Android應(yīng)用中有兩種方法使用ListView。第一種方法是使用一個從ListActivity繼承的Activity,并為其綁定ListAdapter,這種方法適用于將ListView作為整個ActivityUI界面的情況。第二種方式則是直接在UI界面中創(chuàng)建ListView控件。9.3.1以ListActivity使用ListViewListActivity類從Activity類繼承而來,它通過綁定ListAdapter對象來顯示一個數(shù)據(jù)列表。ListActivity類已經(jīng)包含了一個ListView的內(nèi)部類。因此,如果對列表項的顯示格式?jīng)]有特殊要求,不必使用布局文件即可創(chuàng)建ListView。在ListActivity類的onCreate()方法中,可使用setListAdapter()方法為ListView綁定ListAdapter對象??梢允褂肔istActivity的getListView()方法獲得其內(nèi)部包含的ListView對象??墒褂孟率龃a定義一個從ListActivity繼承的子類,顯示一個預(yù)定義的一線城市列表。publicclassMainActivityextendsListActivity

{privateString[]citys={"北京","上海","廣州","天津","重慶","深圳","杭州","南京"};@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);TextViewheader=newTextView(MainActivity.this);header.setText("一線城市列表");

ListViewcitylist=getListView();

citylist.addHeaderView(header);citylist.setAdapter(newArrayAdapter<String>(this,android.R.layout.simple_list_item_1,citys));}}代碼解釋粗體標(biāo)記的代碼給出了創(chuàng)建自定義ListActivity子類的方法。該類從ListActivity繼承,它通過重寫父類的onCreate()方法向列表視圖中添加了一系列數(shù)據(jù)項。可使用ArrayAdapter將以存儲在數(shù)組的數(shù)據(jù)項傳遞給ListView顯示。ArrayAdapter通過泛型指定要適配的數(shù)據(jù)類型,可在其構(gòu)造函數(shù)中傳遞要適配的數(shù)據(jù)。ArrayAdapter有多個構(gòu)造函數(shù)的重載,可根據(jù)實際情況選擇最合適的一種。由于示例代碼提供的數(shù)據(jù)項是字符串類型,因此將ArrayAdapter的泛型指定為String,然后在其構(gòu)造函數(shù)中依次傳入當(dāng)前上下文、ListView子項布局的id以及要適配的數(shù)據(jù)。需要注意的是,示例代碼中使用了android.R.layout.simple_list_item_1作為子項布局的id。它是一個Android系統(tǒng)內(nèi)置的布局文件,可將該布局作為應(yīng)用程序的UI界面顯示一段文本。編譯并運(yùn)行程序,可以通過滾動方式查看屏幕外顯示的數(shù)據(jù),如圖9-15所示。9.3.2以UI控件使用ListView以ListActivity方式使用ListView是將整個Activity都作為一個列表視圖,由于界面較單一,一般很少在UI界面編程中使用。為滿足復(fù)雜UI界面的編程要求,常常將ListView作為UI界面的控件使用。可使用下述粗體字標(biāo)記代碼在一個線性布局中添加一個ListView控件,在控件中以藍(lán)色分割條隔離各個列表項。<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"xmlns:tools="/tools"android:id="@+id/activity_main"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context="com.example.zsp.listviewdemo.MainActivity"><!--設(shè)定列表項的分割線為藍(lán)色,并且數(shù)據(jù)項之間分割10個dp--><ListViewandroid:id="@+id/listviewsimple"android:layout_width="wrap_content"android:layout_height="wrap_content"android:divider="#00F"android:dividerHeight="10dp"/></LinearLayout>為了向ListActivity控件添加列表項數(shù)據(jù),可使用下述粗體字標(biāo)記的代碼創(chuàng)建一個Activity。它首先使用findViewById()方法得到界面布局中定義的ListView控件;然后,再使用一個ArrayAdapter對象將列表項數(shù)據(jù)傳遞給ListView控件。publicclassMainActivityextendsAppCompatActivity{privateListViewlstview;privateArrayAdapter<String>adapter;privateList<String>cities;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);cities=newArrayList<String>();cities.add("北京");cities.add("上海");cities.add("廣州");cities.add("天津");cities.add("重慶");cities.add("杭州");cities.add("南京");

lstview=(ListView)findViewById(R.id.listviewsimple);

adapter=newArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_single_choice,cities);lstview.setChoiceMode(ListView.CHOICE_MODE_SINGLE);lstview.setAdapter(adapter);}}編譯并運(yùn)行程序,可以看到使用控件方法創(chuàng)建的列表視圖,如圖9-16所示。9.3.3Adapter接口在前兩節(jié)的示例代碼中,都使用了ArrayAdapter對象為ListView提供列表項。ArrayAdapter實現(xiàn)了Adapter接口。Adapter接口是連接ListView控件后臺數(shù)據(jù)和前端UI的紐帶,它能夠封裝很多復(fù)雜的數(shù)據(jù)類型,包括數(shù)組、鏈表、數(shù)據(jù)庫和集合等。許多高級的UI控件(例如,ListView、GridView、Spinner和Gallery等),都需要使用Adapter接口的實現(xiàn)類為其提供數(shù)據(jù)源。Adapter接口及其實現(xiàn)類的繼承關(guān)系如圖9-17所示。Adapter接口常用的實現(xiàn)類有ArrayAdapter、SimpleAdapter和CursorAdapter。ArrayAdapter通常用于將數(shù)組或List集合的數(shù)據(jù)封裝成列表項,SimpleAdapter可用于將List集合的對象封裝成列表項,CursorAdapter則僅用于封裝由數(shù)據(jù)庫游標(biāo)提供的數(shù)據(jù)。此外,BaseAdapter類是所有Adapter實現(xiàn)類的基類,它同時實現(xiàn)了ListAdapter和SpinnerAdapter兩個接口。9.4常用widget組件Android提供了一個名為widget的包,它包含了文本框、按鈕、進(jìn)度條和圖片等在UI界面編程中需要經(jīng)常使用的控件。9.4.1文本框(TextView)9.4.2按鈕(Button)9.4.3文本編輯框(EditText)9.4.4圖片顯示框(ImageView)9.4.5進(jìn)度條(ProgessBar)9.4.6Toast9.4.7單選按鈕(Radio)和復(fù)選框(CheckBox)9.4.8拖動條(SeekBar)9.4.1文本框文本框(TextView)是一塊用于顯示文本的屏幕區(qū)域。文本框的顯示區(qū)域不可編輯,往往用來在屏幕中顯示靜態(tài)字符串。TextView類定義了文本框的屬性和基本操作方法。它屬于android.Widget包,并從android.view.View類繼承而來。當(dāng)使用TextView類時,必須導(dǎo)入其所在的包路徑,即android.Widget.TextView。Android為文本框控件提供了<TextView>標(biāo)簽,可通過為該標(biāo)簽下設(shè)置不同的屬性控制文本框的顯示外觀和行為。表9-13給出了TextView經(jīng)常用到的XML屬性??墒褂孟率龃a為一個線性布局中添加五個不同顯示風(fēng)格的TextView控件,說明XML屬性的設(shè)置方法。<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"xmlns:tools="/tools"android:id="@+id/activity_main"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context="com.example.zsp.textviewdemo.MainActivity">

<TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"

android:text="Android界面編程!"

android:textSize="20pt"/><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"

android:singleLine="true"android:ellipsize="middle"

android:textAllCaps="true"android:ellipsize=”middle”android:capitalize=”characters”/><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="電子郵件:hitzsp@163.com"

android:autoLink="email"/><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="字體顏色"

android:textColor="#f00"/><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="12345678"

android:password="true"/></LinearLayout>代碼解釋粗體字標(biāo)記的代碼給出了為TextView控件設(shè)置不同外觀屬性的方法??赏ㄟ^為<TextView>標(biāo)簽設(shè)置不同的屬性控制相應(yīng)文本框控件的顯示外觀。9.4.2按鈕(Button)按鈕(Button)是一個可響應(yīng)用戶單擊操作的UI控件。Button類定義了按鈕的屬性和基本操作方法。它屬于android.Widget包,并從android.Widget.TextView類繼承而來。從類的層次關(guān)系來看,Button類繼承了android.Widget.TextView類的方法和屬性,同時又是CompoundButton、CheckBox、RadioButton以及ToggleButton的父類。Android為按鈕控件提供了<Button>標(biāo)簽,可通過為該標(biāo)簽下設(shè)置不同的屬性控制按鈕的顯示外觀和行為。表9-15給出了Button經(jīng)常用到的XML屬性??墒褂孟率龃a為一個線性布局中添加兩個不同顯示風(fēng)格的Button控件,說明XML屬性的設(shè)置方法。<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"xmlns:tools="/tools"android:id="@+id/activity_m

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論