瘋狂Android講義學習筆記_第1頁
瘋狂Android講義學習筆記_第2頁
瘋狂Android講義學習筆記_第3頁
瘋狂Android講義學習筆記_第4頁
瘋狂Android講義學習筆記_第5頁
已閱讀5頁,還剩102頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

編譯原理

每個Android應用程序都運行在單獨的Dalvik虛擬機內(即每個Android應用程序對

應一條DaMk進程),Dalvik專門針對同時高效地運行多個虛擬機進行了優化,因此Android

系統以方便的實現對應用程序進行隔離。

Dalvik并未完全遵守JVM規范,兩者也不兼容。實際上,JVM虛擬機運行的是Java字

節碼(通常是.class文件),但Dalvik運行的是專有的dex(DalvikExecutable)文件。JVM直

接從.class文件或JAR包中加載字節碼然后運行;而Dalvik則無法直接從.class文件或JAR

包中加載字節碼,它需要通過DX工具將應用程序的所有.class文件編譯成.dex文件,Dalvik

則運行該.dex文件。

Android安裝APK的步驟

1,使用javac編譯*java得到*.class文件。

2.通過DX工具對*.class文件進行轉換,轉換后通常得到一個*.dex文件。

3.通過AAPT工具打包所有的資源文件。打包后通常得到*.ap_文件。

4.通過apkbuilder工具把前兩步得到的文件打包成APK包。

5.簽名apk包

6.對簽名后的.apk文件進行對齊處理。

7.通過ADB工具安裝APK。

因為sdk更新3.0以后apkbuilder已經被刪除了,官方建議使用sdklib.jar打包叩k,

sdklib.jar位于D:\Android\sdk\tools\lib下

Android應用界面編程

所有組件都提供兩種方式來控制組件的行為:

1.在XML布局文件中通過XML屬性進行控制

2.在Java程序代碼中通過調用方法進行控制

可以混合XML布局文件和代碼來控制UI界面

Context代表訪問Android應用環境的全局信息API。

自定義View

當開發者打算派生自己的UI組件時,首先定義一個繼承View基類的子類,然后重寫View

類的一個或多個方法。在使用時,可以用Java代碼來控制也可以用XML布局文件來控制。

布局管理器

可以根據運行平臺來調整組件的大小,程序員要做的只是為容器選擇合適的布局管理器。

1.線性布局LinearLayout

會將容器里的組件一個挨著一個排列起來,可以控制各組橫向排列或縱向排列。它不會

換行,當組件一個挨著一個排列到頭之后,剩下的組件將不會被顯示出來。

android:layout_gravity:設置該子元素在父容器中的對齊方式。

android:gravity:控制它所包含的子元素的對齊方式。

2.表格布局TableLayout

繼承了LinearLayout,本質依然是線性布局管理器。它采用行,列方式來管理UI組件,

不需要明確的聲明包含多少行,多少列,而是通過添加TableRow,其他組件來控制表格的

行數和列數。

每次向表格布局其添加一個TableRow,該TableRow就是一個表格行,TableRow也是

容器,因此它也可以不斷的添加其他組件,每添加一個子組件該表格就增加一列。

如果直接向TableLayout中添加組件,那么這個組件將占用一行。

在表格布局中,列的寬度由該列中的最寬的那個單元格決定,整個表格布局的寬度則取

決于父容器的寬度。

可以為單元格設置三種行為方式:

?Shrinkable收縮

?Stretchable拉伸

?Collapsed隱藏

3.幀布局FrameLayout

繼承了ViewGroup組件,幀布局管理器為每個加入其中的組件創建一個空白區域(稱

為一幀)。每個子組件占據一幀,這些幀都會根據gravity屬性執行自動對齊。它都把組件一

個疊加在一起。

4,相對布局RelativeLayout

相對布局管理器內子組件的位置總是相對兄弟組件,父容器來決定的。

5.網格布局GridLayout

作用類似HTML中的table標簽,它把整個容器劃分為rows*columns個網格,每個網

格可以放置一個組件。除此之外,也可以設置一個組件橫跨多少列,一個組件縱跨多少行。

6,絕對布局AbsoluteLayout

絕對布局由開發人員自己通過X,Y坐標來控制組件的位置。

Android常用的距離單位:

1.px(像素)

2.dip或dp(設備獨立像素)

3.sp(比例像素)

4.in(英寸)

5.mm(毫米)

6.pt(磅)

Textview文本框

直接繼承了View,它還是EditText和Button的父類,作用是在界面上顯示文本。可指

定字體大小,改變文本框的所有字母大寫,添加陰影,還可指定一個背景Drawable來添加

邊框效果。

EditText

允許用戶編輯文本框內容的文本框。

Checked!extView

增加了一個Checked狀態,可通過setChecked(boolean)和isChecked()方法來改變,訪

問該組件的checked狀態。

Button

按鈕類,可以供用戶單擊,當用戶單擊按鈕時,會觸發一個。nClick事件。

9Path圖片

為了實現只縮放圖片中某個部分的效果,可以借助9Path圖片來實現。它是一種特殊的

PNG圖片,它在原始圖片四周添加了一個寬度為1像素的線條,這4條線決定了該圖片的

縮放規則,內容顯示規則。

左側和上側的直線決定了圖片的縮放區域;右側和下側的直線決定了圖片內容顯示區域。

RadioButton和CheckBox

RadioButton單選按鈕,一組RadioButton只能選中其中一個,通常要與RadioGroup—

起使用。

CheckBox復選框

ToggleButton狀態開關按鈕和Switch開關

用于切換程序中的某種狀態。

AnalogClock和DigitalClock時鐘

DigitalClock顯示內容總是當前時間。

AnalogClock繼承View組件,重寫了View的OnDraw方法,它會在View上繪制模擬時鐘。

區別在于DigitalClock顯示數字時鐘,可以顯示當前秒數。AnalogClock顯示模擬時鐘,

不會顯示當前秒數。

Chronometer計時器

并不顯示當前時間,它顯示的是從某個起始時間開始,一共過去了多長時間。

ImageView及其子類

主要功能是顯示圖片,任何Drawable對象都可以使用ImageView來顯示。

ImageButton圖片按鈕

與Button不同的是Button生成的按鈕上顯示文字,而ImageButton上則顯示圖片。可

以指定android:src屬性設置靜態圖片,也可以使用自定義Drawable對象來開發處隨用戶動

作改變圖片的按鈕。

QuickContactBadge關聯聯系人

繼承了ImageView,因此它本質也是圖片,可以通過android:src屬性指定它顯示的圖

片,額外增加的功能是該圖片可以關聯到手機中指定的聯系人,當用戶單擊圖片時,系統將

會打開相應聯系人的聯系方式界面。

AdapterView及子類

具有如下特征:

1.繼承了ViewGroup,本質是容器。

2.可以包括多個列表項,并將多個列表項以合適的形式顯示出來。

3.顯示的多個列表項由Adapter提供。

ListView和ListActivity

ListView以垂直列表的形式顯示所有列表項。創建ListView有兩種方式:

1.直接使用ListView進行創建。

2,讓Activity繼承ListActivity□

一旦獲得ListView之后,就需要為ListView設置它要顯示的列表項,通過

setAdapter(Adapter)方法為之提供Adapter,并由Adapter提供列表項即可。

Adapter接口及其實現類

Adapter是一個接口,派生與ListAdapter和SpinnerAdapter兩個子接口。

Adaptei■常用的實現類如下:

1.ArrayAdapter:用于數組或List集合的多個值包裝成多個列表項。

2.SimpleAdapter:用于將List集合的多個對象包裝成多個列表項。

3.SimpleCursorAdapter:用于包裝Cursor提供的數據。

4.BaseAdapter:通常用于擴展。可以對各項列表項進行最大限度的定制。

?創建ArrayAdapter時必須指定3個參數:

1.Context:代表訪問整個Android應用的接口。

2.textViewResourceld:一個資源ID,代表一個TextView,該組件將作為ArrayAdapter

的列表項組件。

3.數組或List:負責為多個列表項提供數據。

?創建SimpleAdapter時需要5個參數

1.Context

2.一個List<?extendsMap<String,?>>類型的集合對象,該集合中的每個

Map<String,?>對象生成一個列表項。

3.一個界面布局ID,該界面將作為列表項組件。

4.一個String口類型的參數,該參數決定提取Map<String,?>對象中哪些key對應value

來生成列表項。

5.一個int[]類型的參數,該參數決定填充哪些組件。

如果需要監聽用戶單擊,選中某個列表項事件,可通過Ad叩terView的

setOnltemClickListener()方法為單擊事件添加監聽器,或通過

setOnltemSelectedListener()方法為列表項的選中事件添加監聽器。

?通過擴展BaseAdapter來實現Adapter,可以取得對Adapter最大的控制權:程序

要創建多少個列表項,每個列表項的組件由開發者決定。創建一個BaseAdapter對

象,擴展該對象需要重寫如下4個方法:

1.getCount():該方法的返回值控制該Adapter將會包含多少個列表項。

2.getltem(intposition):該方法的返回值決定第position處的列表項內容。

3.getltemld(intposition):該方法的返回值決定第position處的列表項ID0

4.getView(intposition.ViewconvertView,ViewGroupparent):該方法的返回值決定第

position處的列表項組件。

自動完成文本框AutoCompleteTextView

當用戶輸入一定字符之后,自動完成文本框會顯示一個下拉菜單,供用戶選擇,當用戶

選擇某個菜單項之后,它按用戶選擇自動填寫該文本框。它還派生了一個子類:

MultiAutoCompleteTextView,該子類允許輸入多個提示項,多個提示項以分隔符分隔。

使用方法:

1.在布局文件中定義自動完成文本框組件。

2.為它們綁定一個Adapter。

3.可以為MultiAutoCompleteTextView設置分隔符。

網格視圖GridView

用于在界面上按行,列分布的方式來顯示多個組件。它和ListView不同在于,ListView

只顯示一列,而GridView可以顯示多列,同樣需要通過Adapter來提供顯示數據。

可展開的列表組件ExpandableListView

它把應用中的列表項分成幾組,每組里又可包含多個列表項。所顯示的列表項應該由

ExpandableListAdapter提供。

實現ExpandableListAdapter也有如下3種常用方式:

1.擴展BaseExpandableListAdapter實現ExpandableListAdapter,關鍵是實現如下4

個方法:

?getGroupCount。返回包含的組列表項的數量。

?getGroupView。返回的View對象將作為組列表項。

?getChildrenCount()返回特定組所包含的子列表項的數量。

?getChildView()返回的View對象將作為特定組,特定位置的子列表項。

2.使用SimpleExpandableListAdapter將兩個List集合包裝成ExpandableListAdapter0

3,使用SimpleCursorTreeAdapter將Cursor種數據包裝成SimpleCursorTreeAdaptero

Spinner的功能與用法

一個列表選擇框,并不是需要顯示下拉列表,而是相當于彈出一個菜單供用戶選擇。可

以指定android:entries屬性來提供顯示數據,或用Adapter的方式來提供顯示數據。

畫廊視圖Grllery

顯示的是一個水平的列表選擇框。允許用戶通過拖動來查看上一個,下一個列表項。只

要為它提供一個內容Adapter即可,該Adapter的getView()方法所返回的View將作為

Gallery列表的列表項。

Ad叩terViewFlipper的功能與用法

繼承了AdapterViewAnimator,它也會顯示Adapter提供的多個View組件,但它每次

只能顯示一個View組件,程序可以控制該組件顯示上一個,下一個組件,可以在多個View

切換過程中使用漸隱漸顯的動畫效果。

StackView的功能與用法

它用于顯示Adapter提供的系列View,它將會以堆疊的方式來顯示多個列表項。它提

供了如下兩種控制方式:

1.拖走StackView中處于頂端的View,下一個View將會顯示出來。將上一個View拖進

StackView,將使之顯示出來。

2,通過調用StackView的showNext(),showPrevious()控制顯示下一個,上一^組件。

ProgressBar的功能與用法

Android支持多種風格的進度條,通過style屬性可以為其指定風格。還提供如下方法

來操作進度:

1.setProgress(int)設置進度條的完成百分比。

2.incrementPorgressBy(int)設置進度條進度增加或減少。當參數為正數時進度增加,當參

數為負數時進度減少。

還有一種進度條,可以直接在窗口標題上顯示,需要如下兩個步驟:

1.調用Activity的requestWindowFeature。方法,該方法根據傳入的參數可啟用特定

的窗口特征,傳入Window.FEATUREJNDETERMINATE_PROGRESS在窗口標題上顯

示不帶進度的進度條,傳入Window.FEATURE_PROGRESS則顯示帶進度的進度條。

2.調用Activity的setProgressBarVisibility(Boolean)或

setProgressBarlndeterminateVisibility(Boolean)方法即可控制進度條的顯示與隱藏。

拖動條SeekBar的功能與用法

可以拖動滑塊來改變值,通常用于對系統的某種數值進行調節。可以通過指定

android:thumb的屬性來改變拖動條的滑塊外觀

星級評分條RatingBar的功能與用法

通過星星來表示進度的特殊進度條。

Viewswitcher的功能與用法

是一個視圖切換組件,繼承FrameLayout,可以將多個View層疊在一起,每次只顯示

一個組件。當程序控制從一個View切換到另一個View時,可以支持指定動畫效果。為了給

ViewSwitcher添加多個組件,一般通過調用setFactory(ViewSwticher.ViewFactory)方法為之

設置ViewFactory,并由該ViewFactory為之創建View即可。

圖像切換器ImageSwitcher

繼承ViewSwitcher,可以切換View組件時使用動畫效果。使用它只需要2步:

1.為ImageSwitcher提供一個ViewFactory,該ViewFactory生成的View組件必須是

ImageVieWo

2,需要切換圖片時,只要調用ImageSwitcher的setlmageDrawable(Drawabledrawable),

setlmageResource(intresid)和setlmageURI(Uriuir)方法更換圖片即可。

文本切換器TextSwitcher

繼承ViewSwitcher,可以切換View組件時使用動畫效果,也要設置一個ViewFactory,

該ViewFactory的makeView。方法必須返回一個TextView。

ViewFilpper功能與用法

繼承ViewAnimator,可以調用addView(Viewv)添加多個組件,可以使用動畫控制多個

組件的切換效果。它與AdapterViewFlipper的區別是ViewFlipper需要開發者通過addView()

添加多個View,而AdapterViewFlipper則只要傳入一個Adapter,adapter將會負責提供多

個Viewo

使用Toast顯示提示信息框

它具有如下特征:

1.提示信息不會獲得焦點

2.提示信息過一段時間會自動消失

使用步驟:

1.調用Toast的構造器或makeText()靜態方法創建一個Toast對象。

2.調用Toast的方法來設置該消息提示的對齊方式,頁邊距等。

3,調用Toast的show。方法將它顯示出來。

如果需要顯示諸如圖片,列表之類的復雜提示,則調用Toast構造器創建實例,再調用

setView()方法設置該Toast顯示的View組件。

日歷視圖CalendarView

可用于顯示和選擇日期,用戶既可以選擇一個日期,也可通過觸摸來滾動曰歷。可以調

用該組件的setOnDateChangeListener。方法為此組件添加點擊事件監聽器。

日期,時間選擇器DatePicker和TimePicker

DatePicker可用于選擇日期,TimePicker可用于選擇時間。

數值選擇器NumberPicker

用于讓用戶輸入數值,用戶既可以通過鍵盤輸入數值,也可以通過拖動來選擇數值。

搜索框SearchView

可以讓用戶在文本框內輸入文字,并允許通過監聽器監控用戶輸入,當用戶輸入完成后

提交搜索時,也可以通過監聽器執行實際搜索。

選項卡TabHost

可以很方便地在窗口上放置多個標簽頁,每個標簽頁相當于獲得一個與外部容器相同大

小的組件擺放區域。通過這種方式,就可以在一個容器里放置更多組件。

與TabHost結合使用的還有如下組件:

1.TabWidget:選項卡的標簽條

2.TabSpec:選項卡的一個Tab頁面

TabHost僅僅是個容器,它提供如下兩個方法創建,添加選項卡

1.newTabSpec:創建選項卡

2.addTab(TabHost.TabSpectabSpec):添力口選項卡

使用TabHost的一般步驟如下:

1.在界面布局中定義TabHost組件,并為組件定義該選項卡的內容。

應該繼承

2.ActivityTabActivityo

3,調用TabActivity的getTabHost()方法獲取TabHost對象。

4.通過TabHost對象的方法創建,添加選項卡。

滾動視圖ScrollView

用于為普通組件添加滾動條的組件,該組件里最多只能包含一個組件,而它的作用就是

為該組件添加垂直滾動條。默認是垂直的滾動條,如果要使用水平滾動條則要使用

HorizontalScrollVieWo

Notification的功能與用法

是顯示在手機狀態欄的通知。程序一般通過NotificationManager服務來發送

Notification。發送Notification需要按如下步驟:

1,調用getSystemSerive(NCTnFICATION_SERVICE)方法獲取系統的NotificationManager月艮

務。

2.通過構造器創建一個Notification對象。

3,為Notification設置各種屬性。

4.通過NotificationManager發送Notification。

對話框

Android提供了4種常用對話框

1.AlertDialog:實際應用最廣的對話框

2.ProgressDialog:進度對話框

3.DatePickerDialog:日期選擇對話框

4.TimePickerDialog:時間選擇對話框

使用AlertDialog對話框的幾個步驟:

1,使用創建AlertDialog.Builder對象。

2.調用AlertDialog.Builder的setTitle。或setCustomTitle。方法設置標題。

3,調用AlertDialog.Builder的setlcon。方法設置圖標。

4.調用AlertDialog.Builder的相關設置方法設置對話框內容。

5.調用AlertDialog.Builder的setPositiveButton(),setNegativeButton或

setNeutralButton()方法添加多個按鈕。

6.調用AlertDialog.Builder的create。方法創建AlertDialog對象,再調用AlertDialog

對象的show()方法將該對話框顯示出來。

其中第4步中的設置方法有如下6種:

1.setMessage()設置對話內容為簡單文本內容。

2.setltems()設置對話框內容為簡單列表項。

3.setSingleChoiceltems。設置對話框內容為單選列表項。

4.setM3tiChoiceltems()設置對話框內容為多選列表項。

5.setAdapter。設置對話框內容為自定義列表項。

6.setView()設置對話框內容為自定義View。

PopupWindow

可以創建類似對話框風格的窗口,只要如下兩步即可:

1.調用PopupWindow的構造器創建對象。

2,調用PopupWindow的showAsDropDown(Viewv)將PopupWindow作為v的組件的下

拉組件顯示出來,或調用showAtLocation。方法將PopupWindow在指定位置顯示出來。

使用DatePickerDialog,TimeTickerDialog

使用它們只需2步:

1.通過new關鍵字創建DatePickerDialog,TimePickerDialog實例,調用它們的show。方

法即可將日期選擇對話框,時間選擇對話框顯示出來。

2.為DatePickerDialog,TimePickerDialog綁定監聽器。

使用ProgressDialog創建進度對話框

創建進度對話框有如下兩種方式:

1.如果只是創建簡單的進度對話框,調用ProgressDialog提供的show()方法顯示對話框

即可。

2.創建ProgressDialog,然后調用方法對對話框里的進度條進行設置,設置完成后將對話

框顯示出來。

菜單

Menu接口只是一個父接口,它有如下兩個子接口:

1.SubMenu:代表一個子菜單。

2.ContextMenu:代表一?"上下文菜單。

添加菜單或子菜單的步驟如下:

1.重寫Activity的onCreateOptionsMenu(Menumenu)的方法,在該方法里調用Menu對

象的方法來添加菜單項或子菜單。

2.如果希望應用程序能響應菜單項的點擊事件,重寫Activity的

onOptionltemSelected(Menultemmi)方法即可。

使用監聽器來監聽菜單事件

可以為不同菜單分別綁定監聽器,使用

setOnMenultemClickListener(Menultem.OnMenultemClickListenermenultemClickListener)來

綁定監聽器。但通過為每個菜單綁定監聽器會使代碼更為臃腫,因此一般不推薦為每個慘淡

分別綁定監聽器。

創建復選菜單項和單選菜單項

setCheckable(Booleancheckable)設置該菜單項是否可以勾選。

setGroupCheckable(intgroup,booleancheckable,booleanexclusive)設置group組里的所有

菜單項是否可勾選,如果exclusive為true,那么它們將是一組單選菜單項。

設置于菜單項關聯的Activity

只要調用Menuitem的setlntent(lntentintent)方法即可,該方法把菜單項與指定Intent

關聯到一起,當用戶單擊該菜單項時,該Intent所代表的組件將會啟動。

上下文菜單

開發上下文菜單的步驟如下:

1.重寫Activity的OnCreateContextMenu(ContextMenumenu,View

source,ContextMenu.ContextMenuInfomenuinf。)方法。

2.調用Activity的registerForContextMenu(Viewview)方法為view組件注冊上下文菜單。

3.如果希望應用程序能為菜單項提供響應,可以重寫onContextltemSelected(Menultem

mi)方法,或為指定菜單項綁定監聽器。

使用XML文件定義菜單

菜單資源通常應該放在/res/menu目錄下,菜單資源的根元素通常是〈menu…/>元素,

〈menu…/>元素無須指定任何屬性。〈menu…/>元素內可包含如下元素:

1.〈item…/>:定義菜單項,(item…/>元素又可包含〈menu…/>元素,位于〈item…/>元素

內部的〈menu…/>就代表了子菜單。

2.〈group…/>:將多個〈item…/>定義的菜單包裝成一個菜單組,它用于控制整組菜單的

行為。

在程序中定義了資源后,接下來重寫onCreateOptionsMenu(用于創建選項菜單),

onCreateContextMenu(用于創建上下文菜單)方法,在這些方法種調用Menulnflater對象的

inflate方法裝載指定資源對應的菜單即可。

使用XML資源定義菜單的好處:

1.XML資源文件不僅負責定義界面,也負責定義菜單,這樣可把所有界面相關的內容交

給XML文件管理,而Java代碼的功能更集中。

2.后期更新,維護應用時,如果需要更新,維護菜單,打開,編輯XML文件即可,避免

對Java文件的修改。

使用PopuoMenu創建彈出式菜單

它會在指定組件上彈出PopupMenu,默認情況下,PopupMenu會顯示在該組件的下方

或上方。可增加多個菜單項,并可為菜單項添加子菜單。

創建PopupMneu菜單的步驟如下:

1.調用newPopupMenu(Contextcontext,Viewanchor)創建下拉菜單,anchor代表要激發

該彈出菜單的組件。

2,調用Menulnflater的inflate。方法將菜單資源填充到PopupMenu中。

3.調用PopupMenu的show。方法顯示彈出式菜單。

使用活動條ActionBar

位于傳統標題欄的位置,也就是顯示的屏幕的頂部。它可顯示應用的圖標和Activity標

題,也就是前面應用程序的頂部顯示的內容,除此之外,ActionBar的右邊還可以顯示活動

項。歸納起來,ActionBar提供如下功能:

1.顯示選項菜單的菜單項(將菜單項顯示成ActionItem)。

2.使用程序圖標作為返回HOME主屏或向上的導骯操作。

3.提供交互式View作為ActionView。

4.提供基于Tab的導航方式,可用于切換多個Fragment。

5.提供基于下拉的導航方式。

Android3.0版本已經默認啟用了ActionBar,只要在AndroidManifest.xml文件的SDK配

置中指定了該應用的目標版本高于11,那么默認就會啟用ActionBaro

使用ActionBar顯示選項菜單

為了解決手機不再強制提供MENU按鍵,導致用戶無法打開選項菜單的問題,Android

提供了ActionBar作為解決方案,ActionBar可以將選項菜單顯示成Actionitem。Android3.0

開始,Menuitem新增了如下方法:

setShowAsAction(intactionEnum):該方法設置是否將該菜單項顯示在ActionBar上,作為

Actionitemo該方法支持如下參數值:

1.SHOW_AS_ACTION_ALWAYS:總是將該Menuitem顯示在ActionBar上。

2.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW:將該ActionView折疊成普通菜單項。

3.SHOW_AS_ACTION_IF_ROOM:當ActionBar位置足夠時才顯示Menuitem。

4.SH0W_AS_ACTI0N_NEVER:不將該Menuitem顯示在ActionBar上。

5.SHOW_AS_ACTION_WITH_TEXT:將該Menuitem顯示在ActionBar上,并顯示該菜單

項的文本。

允許在XML菜單資源文件中為〈item…/>元素指定如下屬性:

android:showAsAction:該屬性值的作為類似于setShowAsAction(intactionEnum)。

啟動程序圖標導航

為了將應用程序圖標轉換為可點擊的圖標,可調用ActionBar的如下方法:

1.setDisplayHomeAsUpEnabled(BooleanshowHomeAsUp):設置是否將應用程序圖標轉

變成可點擊的圖標,并在圖標上添加一個向左箭頭。

2.setDisplayOptions(intoptions)通過傳入int類型常量來控制該ActionBar的顯示選項。

3.setDispl;ayShowHomeEnabled(BooleanshowHome):設置是否顯示應用程序的圖標。

4.setHomeButtonEnabled(Boolear)enabled):設置是否將應用程序圖標轉變成可點擊的按

鈕。

添加ActionView

ActionBar除了可以顯示普通的ActionItem外,還可以顯示普通的UI組件。為了在

ActionBar上添加ActionView,可以用如下兩種方式:

1,定義ActionItem時使用android:actionViewClass屬性指定ActionView的實現類。

2,定義ActionItem時使用android:actionLayout屬性指定ActionView對應的視圖資源。

使用ActionBar實現Tab導航

ActionBar在頂端生成多個Tab標簽,當用戶點擊某個Tab標簽時,系統根據用戶點擊

事件導航指定Tab頁面。按如下步驟進行即可:

1,調用ActionBar的setNavigationMode(ActionBar.NAVIGATION_MODE_TABS)方法設置

使用tab導航方式。

2.調用ActionBar的addTab()方法添加多個tab標簽,并為每個標簽添加事件監聽器。

Fragment簡介

Fragment相當于Activity片段,通常單獨的Activity組合多個Fragment,這樣即可在一

個Activity創建多個用戶界面。除此之外,也可以多個Activity復用同一個Fragment。總之

Fragment相當于Activity的模擬區域。

使用ActonBar實現下拉式導航

ActionBar除可提供Tab導航支持之外,還提供了下拉式導航方式。下拉式導航的

ActionBar在頂端生成下拉列表框,當用戶單擊某個列表項時,系統根據用戶單擊事件導航

指定的Fragmento實現它按如下步驟即可:

1.調用ActionBar的actionBar.setNavigationMode(ActionBar.NAVIGACTON_MODE_LIST)

方法設置使用下拉列表的導航方式。

2.調用ActionBar的setListNavigationCallbacks(SpinnerAdapter

adapter,ActionBar.onNavigationListenercallback)。添加多個列表項,并為每個列表項設

置監聽器。

Android的事件處理

目錄

Android的事件處理13

基于監聽的事件處理13

基于回調的事件處理14

響應系統設置的事件15

Handler消息傳遞機制15

異步任務(AsyncTask)16

兩套事件處理機制:

1.基于監聽的事件處理

可以在界面布局文件中android:onClick屬性指定事件監聽方法。

2.基于回調的事件處理

主要是重寫組件特定的回調方法,或重寫Activity的回調方法。

基于監聽的事件處理

在事件監聽的處理模型中,主要涉及如下三類對象:

1.Eventsource事件源:事件發生的場所,通常是各個組件。

2.Event事件:事件封裝了界面組件上發生的特定事情。如果程序需要獲得界面組件上所

發生事件的相關信息,一般通過Event對象來取得。

3.EventListener事件監聽器:負責監聽事件源所發生的事件,并對各種事件做出相應的響

應。

Android的事件處理機制是一種委派式事件處理方式:普通組件(事件源)將整個事件

處理委托給特定的對象(事件監聽器);當該事件源發生特定的事件時,就通知所委托的事

件監聽器,由事件監聽器來處理這個事件。

基于監聽的事件處理模型的編程步驟如下:

1,獲取普通界面組件(事件源),也就是被監聽的對象。

2.實現事件監聽器類,該監聽器類是一個特殊的Java類,必須實現一個xxxListener接口。

3.調用事件源的setXxxListener方法將事件監聽器對象注冊給普通組件(事件源)。

事件與事件監聽器

如果事件源觸發的事件足夠簡單,事件里封裝的信息比較有限,那就無須封裝事件對象,

將事件對象傳入事件監聽器。但對于鍵盤事件,觸摸事件等,此時程序需要獲取事件發生的

詳細信息,對于這種包含更多信息的事件,Android同樣會將事件信息封裝成XxxEvent對

象,并把該對象作為參數傳入事件處理器。

在程序中實現事件監聽器,通常有如下幾種形式:

1.內部類形式:將事件監聽器類定義成當前類的內部類。

2.外部類形式:將事件監聽器定義為一個外部類。

3.Activity本身作為事件監聽器:讓Activity本身實現監聽器接口,并實現事件處理方

法。

4.匿名內部類形式:使用匿名內部類創建事件監聽器對象。

內部類作為事件監聽器類

使用內部類可以在當前類中復用該監聽器;因為監聽器是外部類的內部類,所以可以自

由訪問外部類的所有界面組件。

外部類作為事件監聽器類

使用外部類定義事件監聽器類的形式比較少見,主要因為如下兩個原因:

1.事件監聽器通常屬于特定的GUI界面,定義成外部類不利于提高程序的內聚性.

2.外部類形式的事件監聽器不能自由訪問創建GUI界面的類中的組件,編程不夠簡潔。

但如果某個事件監聽器確實需要被多個GUI界面所共享,而且主要是完成某種業務邏

輯的實現,則可以考慮使用外部類的形式來定義事件監聽器類。

Activity本身作為監聽器

這種形式非常簡潔,但這種做法有兩個缺點:

1.這種形式可能造成程序結構混亂,Activity的主要職責應該是完成界面初始化工作,但

此時還需包含事件處理器方法,從而引起混亂。

2.如果Activity界面類需要實現監聽器接口,讓人感覺比較怪異。

匿名內部類作為事件監聽器類

因大部分事件監聽器只是臨時使用一次,所以使用匿名內部類形式的事件監聽器更合適。

直接綁定到標簽

直接在界面布局文件中指定標簽綁定事件處理方法。許多組件都支持。nClick屬性,該

屬性的屬性值就是一個形如xxx(Viewsource)的方法的方法名。

基于回調的事件處理

如果說事件監聽機制是一種委托式的事件處理,那么回調機制則恰好與之相反。對于基

于回調的事件處理模型來說,事件源與事件監聽器是統一的,或者說事件監聽器完全消失了。

在用戶在GUI組件上激發某個事件時,組件自定特定的方法將會負責處理該事件。

而Java又是一種靜態語言,我們無法為某個對象動態的添加方法,因此只能繼承GUI

組件類,并重寫該類的事件處理方法來實現。

基于回調的事件傳播

幾乎所有基于回調的事件處理方法都有一個boolean類型的返回值,該返回值用于標

識該處理方法是否能完全處理該事件:

1.如果返回true,表明該處理方法已完全處理該事件,該事件不會傳播出去。

2.如果返回false,表明該處理方法并未完全處理該事件,該事件會傳播出去。

當該組件上發生某個按鍵被按下的事件時,系統最先觸發的應該是該按鍵上綁定的事件

監聽器,接著才觸發該組件提供的事件回調方法,然后還會傳播到該組件所在的Activityo

重寫onTouchEvent方法響應觸摸屏事件

基于回調的事件處理更適合應付那種事件處理邏輯比較固定的View。

響應系統設置的事件

Configruation類

專門用于描述手機設備上的配置信息,這些配置信息既包括用戶特定的配置項,也包括

系統的動態設備配置。

重寫onConfigurationChanged響應系統設置更改

如果需要監聽系統設置的更改,則可以考慮重寫

onConfigurationChanged(ConfigurationnewConfig)方法,該方法是一^基于回調的事件處

理方法:當系統設置發生更改時,該方法會被自動觸發。

為了讓Activity能監聽設置更改事件,需要在配置該Activity時指定

anroid:configChanges屬性,該屬性可以支持很多設置屬性值。

Handler消息傳遞機制

Android的UI操作并不是線程安全的,這意味著如果有多個線程并發操作UI組件,可

能導致線程安全問題,為了解決這個問題,Android制定了一條簡單的規則:只允許UI線程

修改Activity里的UI組件。

Android的消息傳遞機制是另一種形式的“事件處理”,這種機制主要為了解決Android

應用的多線程問題,Android平臺只允許UI線程修改Activity里的UI組件,這樣就會導致

新啟動的線程無法動態改變界面組件的屬性值。但在實際Android應用開發中,尤其是涉及

動畫的游戲開發中,需要讓新啟動的線程周期性地改變界面組件的屬性值,這就需要借助

Handler的消息傳遞機制來實現了。

Handler的主要作用有兩個:

1.在新啟動的線程中發送消息。

2.在主線程中獲取,處理消息。

為了讓主線程適時地處理新啟動的線程所發送的消息,顯然只能通過回調的方式來實現,

開發者只要重寫Handler類中的處理消息的方法,當新啟動的線程發送消息時,消息會發送

到與之關聯的消息隊列,而Handler會不斷地從消息隊列中獲取并處理消息,這就導致

Handler類中的處理消息的方法被回調。

Handler,Loop,MessageQueue的工作原理

與Handler一起工作的幾個組件:

1.Message:Handler接收和處理的消息對象。

2.Looper:每個線程只能擁有一個Looper。它的loop方法負責讀取MessageQueue中的

消息,讀到信息后就把消息交給發送該消息的Handler進行處理。

3.MessageQueue:消息隊列,它采用先進先出的方式來管理Message。程序創建Looper

對象時會在它的構造器中創建Looper對象。

Handler:它的作用是發送消息和處理消息,程序使用Handler發送消息,被Handler發

送的消息必須被送到指定的MessageQueue。也就是說,如果希望Handler正常工作,必須

在當前線程中有一個MessageQueue,否則消息就沒有MessageQueue進行保存了。不過

MessageQueue是由Looper負責管理的,也就是說,如果希望Handler正常工作,必須在

當前線程中有一個Looper對象。為了保證當前線程中有Looper對象,可以分如下兩種情

況處理:

1.主UI線程中,系統已經初始化了一個Looper對象,因此程序直接創建Handler即可,

然后就可通過Handler來發送消息,處理消息。

2.程序員自己啟動的子線程,程序員必須自己創建Looper對象,并啟動它。創建Looper

對象調用它的prepare。方法即可。

在線程中使用Handler的步驟如下:

1.調用Looper的prepare。方法為當前線程創建Looper對象,創建Looper對象時,它的

構造器會創建與之配套的MessageQueue。

2,有了Looper之后,創建Handler子類的實例,重寫handleMessage。方法,該方法負責

處理來自于其他線程的消息。

3.調用Looper的loop。方法啟動Looper。

異步任務(AsyncTask)

為了解決新線程不能更新UI組件的問題,Android提供如下幾種解決方案:

1.使用Handler實現線程之間的通信。

2.Activity.runOnUiThread(Runnable)

3.View.post(Runnable)

4.View.postDelayed(RunnableJong)

2,3,4的方式可能導致編程比較繁瑣,而異步任務則可進一步簡化這種操作。

一個抽象類,通常用于被繼承,繼承AsyncTask是需要指定如下三個泛型參

數:

?Params:啟動任務執行的輸入參數類型。

?Progress:后臺任務完成的進度值的類型。

?Result:后臺執行任務完成后返回結果的類型。

使用AsyncTask只要如下3步即可:

1.創建AsyncTask的子類,并為三個泛型參數指定類型。如果某個泛型參數不需要指定類

型,可將它指定為void。

2.根據需要,實現AsyncTask的如下方法:

?dolnBackgroud(Params--)

?onProgressUpdate(Progress-values)

?onPreExecute()

?onPostExecute(Resultresult)

3.調用AsyncTask子類的實例execute(Params,params)開始執行耗時任務。

使用AsyncTask時必須遵守的規則:

1.必須在UI線程中創建AsyncTask的實例。

2.必須在UI線程中調用AsyncTask的execute。方法。

3.AsyncTask的onPreExecute(),onPostExecute(Resultresult),

dolBackground(Params--params),onProgressUpdate(Progress…values)方法,不應該由

程序員代碼調用,而是由Android系統負責調用。

4.每個AsyncTask只能被執行一次,多次調用將會引發異常。

深入理解Activity與Fragment

目錄

深入理解Activity與Fragment18

Activity是什么18

建立,配置和使用Activity18

啟用,關閉Activity19

使用Bundle在Activity之間交換數據19

啟動其他Activity并返回結果20

Activity的回調機制20

Activity的生命周期與加載模式20

Fragment詳解22

Fragment與Activity通信23

Fragment管理與Fragment事務24

Fragment的生命周期24

Activity是什么

Activity是一個應用程序組件,提供一個屏幕,用戶可以用來交互為了完成某項任務。

Activity中所有操作都與用戶密切相關,是一個負責與用戶交互的組件,可以通過

setContentView(View)來顯示指定控件。

在一個android應用中,一個Activity通常就是一個單獨的屏幕,它上面可以顯示一些

控件也可以監聽并處理用戶的事件做出響應。Activity之間通過Intent進行通信。

建立,配置和使用Activity

建立自己的Activity需要繼承Activity基類,創建Activity需要實現一個或多個方法。

LauncherActivity開發啟動Activity的列表

LauncherActivity繼承了ListActivity,它開發出來的列表界面中每個列表項都對應一個

Intent,因此當用戶單擊不同的列表項時,應用程序會自動啟動對應的Activity。需要為它設

置Adapter數據,重寫IntentintentForPosition(int),該方法根據不同列表項返回不同的Intent

(用于啟動不同的Activity)。

ExpandableListActivity:用于顯示一個可展開的列表窗口。

PreferenceActivity:用于顯示一個顯示設置選項參數并進行保存的窗口。

創建PreferenceActivity它需要建立選項設置的布局文件。Android3.0建議將

PreferenceActivity與preferenceFragment結合使用,PreferenceActivity負責加載選項設置

列表的布局文件,preferenceFragment負責加載選項設置的布局文件。

當加載了選項布局文件并建立相應的Activity類后,還需要在AndroidManifest.xml清單

文件中配置Activity才能使用Activity類。

最后程序所設置的參數將會保存在/data/data/<應用程序包名〉/shared_prefs路徑下,

文件名為〈應用程序包g>_preferences.xml。

啟用,關閉Activity

一個Android應用通常都會包含多個Activity,但只有一個Activity會作為程序的入口,

當該Activity應用運行時將會自動啟動并執行該Activity。至于應用中的其他Activity,通常

都由入口Activity啟動,或由入口Activity啟動的Activity啟動。

Activity啟動其他Activity有如下兩個方法:

1.startActivity(Intentintent):啟動其他Activity。

2.startActivityForResult(lntentintent,intrequestCode):以指定的請求碼來啟動Activity,

而且程序將會等到新啟動Activity的結果(通過重寫onActivityResult。方法來獲取),

requestCode參數的值由開發者根據業務自行設置,用于標識請求來源。

關閉Activity也有如下兩個方法:

1.finish():結束當前Activity

3.finishActivity(intrequestCode):結束以startActivityForResult(lntentintent,int

requestCode)方法啟動的Activity0

使用Bundle在Activity之間交換數據

當一個Activity啟動另一個Activity時,常常會有一些數據需要傳過去。在Activity之間

進行數據交換更簡單,因為兩個Activity之間本來就有一個信使Intent,因此我們主要將需

要交換的數放入Intent即可。

Intent主要通過Bundle對象來攜帶數據。它主要提供了如下方法存取數據:

1.putXxx(Stringkey.Xxxdata)

2.putSerializable(Stringkey,Serializabledata)

3.getXxx(Stringkey)

4.getSerializable(Stringkey,Serializabledata)

啟動其他Activity并返回結果

Activity提供了一個startActivityForResult(lntentintent,intrequestCode)方法來啟動其他

Activity,,該方法用于啟動指定Activity,而且期望獲取指定Activity返回的結果。它也是通過

Bundle進行數據交換的,為了獲取被啟動的Activity所返回的結果,需要從兩方面入手:

1.當前Activity需要重寫onActivityResult(intrequestCode,intresultCode,Intentintent),當

被啟動的Activity返回結果時,該方法將會被觸發,其中requestCode代表請求碼,而

resultcode代表Activity返回的結果碼,這個結果碼也是由開發者根據業務自行設定的。

2.被啟動的Activity需要調用setResult。方法設置處理結果。

一個Activity中可能包含多個按鈕,并調用多個startActivityForResult。方法來打開多個

不同的Activity處理不同的業務,當這些新的Activity關閉后,系統都將回調前面Activity的

onActivityResult(intrequestCode,intresultCode,Intentdata)方法。為了知道該方法時由哪個

請求的結果所觸發的,可利用requestCode請求碼;為了知道返回的數據來自于哪個新的

Activity,可利用resultCode結果碼。

Activity的回調機制

當開發者開發一個組件時,如果開發者需要該組件能響應特定的事件,可以選擇性實現

該組件的特定方法,當用戶在該組件上激發

溫馨提示

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

評論

0/150

提交評論