版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
編譯原理
每個(gè)Android應(yīng)用程序都運(yùn)行在單獨(dú)的Dalvik虛擬機(jī)內(nèi)(即每個(gè)Android應(yīng)用程序?qū)?/p>
應(yīng)一條DaMk進(jìn)程),Dalvik專門針對(duì)同時(shí)高效地運(yùn)行多個(gè)虛擬機(jī)進(jìn)行了優(yōu)化,因此Android
系統(tǒng)以方便的實(shí)現(xiàn)對(duì)應(yīng)用程序進(jìn)行隔離。
Dalvik并未完全遵守JVM規(guī)范,兩者也不兼容。實(shí)際上,JVM虛擬機(jī)運(yùn)行的是Java字
節(jié)碼(通常是.class文件),但Dalvik運(yùn)行的是專有的dex(DalvikExecutable)文件。JVM直
接從.class文件或JAR包中加載字節(jié)碼然后運(yùn)行;而Dalvik則無法直接從.class文件或JAR
包中加載字節(jié)碼,它需要通過DX工具將應(yīng)用程序的所有.class文件編譯成.dex文件,Dalvik
則運(yùn)行該.dex文件。
Android安裝APK的步驟
1,使用javac編譯*java得到*.class文件。
2.通過DX工具對(duì)*.class文件進(jìn)行轉(zhuǎn)換,轉(zhuǎn)換后通常得到一個(gè)*.dex文件。
3.通過AAPT工具打包所有的資源文件。打包后通常得到*.ap_文件。
4.通過apkbuilder工具把前兩步得到的文件打包成APK包。
5.簽名apk包
6.對(duì)簽名后的.apk文件進(jìn)行對(duì)齊處理。
7.通過ADB工具安裝APK。
因?yàn)閟dk更新3.0以后apkbuilder已經(jīng)被刪除了,官方建議使用sdklib.jar打包叩k,
sdklib.jar位于D:\Android\sdk\tools\lib下
Android應(yīng)用界面編程
所有組件都提供兩種方式來控制組件的行為:
1.在XML布局文件中通過XML屬性進(jìn)行控制
2.在Java程序代碼中通過調(diào)用方法進(jìn)行控制
可以混合XML布局文件和代碼來控制UI界面
Context代表訪問Android應(yīng)用環(huán)境的全局信息API。
自定義View
當(dāng)開發(fā)者打算派生自己的UI組件時(shí),首先定義一個(gè)繼承View基類的子類,然后重寫View
類的一個(gè)或多個(gè)方法。在使用時(shí),可以用Java代碼來控制也可以用XML布局文件來控制。
布局管理器
可以根據(jù)運(yùn)行平臺(tái)來調(diào)整組件的大小,程序員要做的只是為容器選擇合適的布局管理器。
1.線性布局LinearLayout
會(huì)將容器里的組件一個(gè)挨著一個(gè)排列起來,可以控制各組橫向排列或縱向排列。它不會(huì)
換行,當(dāng)組件一個(gè)挨著一個(gè)排列到頭之后,剩下的組件將不會(huì)被顯示出來。
android:layout_gravity:設(shè)置該子元素在父容器中的對(duì)齊方式。
android:gravity:控制它所包含的子元素的對(duì)齊方式。
2.表格布局TableLayout
繼承了LinearLayout,本質(zhì)依然是線性布局管理器。它采用行,列方式來管理UI組件,
不需要明確的聲明包含多少行,多少列,而是通過添加TableRow,其他組件來控制表格的
行數(shù)和列數(shù)。
每次向表格布局其添加一個(gè)TableRow,該TableRow就是一個(gè)表格行,TableRow也是
容器,因此它也可以不斷的添加其他組件,每添加一個(gè)子組件該表格就增加一列。
如果直接向TableLayout中添加組件,那么這個(gè)組件將占用一行。
在表格布局中,列的寬度由該列中的最寬的那個(gè)單元格決定,整個(gè)表格布局的寬度則取
決于父容器的寬度。
可以為單元格設(shè)置三種行為方式:
?Shrinkable收縮
?Stretchable拉伸
?Collapsed隱藏
3.幀布局FrameLayout
繼承了ViewGroup組件,幀布局管理器為每個(gè)加入其中的組件創(chuàng)建一個(gè)空白區(qū)域(稱
為一幀)。每個(gè)子組件占據(jù)一幀,這些幀都會(huì)根據(jù)gravity屬性執(zhí)行自動(dòng)對(duì)齊。它都把組件一
個(gè)疊加在一起。
4,相對(duì)布局RelativeLayout
相對(duì)布局管理器內(nèi)子組件的位置總是相對(duì)兄弟組件,父容器來決定的。
5.網(wǎng)格布局GridLayout
作用類似HTML中的table標(biāo)簽,它把整個(gè)容器劃分為rows*columns個(gè)網(wǎng)格,每個(gè)網(wǎng)
格可以放置一個(gè)組件。除此之外,也可以設(shè)置一個(gè)組件橫跨多少列,一個(gè)組件縱跨多少行。
6,絕對(duì)布局AbsoluteLayout
絕對(duì)布局由開發(fā)人員自己通過X,Y坐標(biāo)來控制組件的位置。
Android常用的距離單位:
1.px(像素)
2.dip或dp(設(shè)備獨(dú)立像素)
3.sp(比例像素)
4.in(英寸)
5.mm(毫米)
6.pt(磅)
Textview文本框
直接繼承了View,它還是EditText和Button的父類,作用是在界面上顯示文本??芍?/p>
定字體大小,改變文本框的所有字母大寫,添加陰影,還可指定一個(gè)背景Drawable來添加
邊框效果。
EditText
允許用戶編輯文本框內(nèi)容的文本框。
Checked!extView
增加了一個(gè)Checked狀態(tài),可通過setChecked(boolean)和isChecked()方法來改變,訪
問該組件的checked狀態(tài)。
Button
按鈕類,可以供用戶單擊,當(dāng)用戶單擊按鈕時(shí),會(huì)觸發(fā)一個(gè)。nClick事件。
9Path圖片
為了實(shí)現(xiàn)只縮放圖片中某個(gè)部分的效果,可以借助9Path圖片來實(shí)現(xiàn)。它是一種特殊的
PNG圖片,它在原始圖片四周添加了一個(gè)寬度為1像素的線條,這4條線決定了該圖片的
縮放規(guī)則,內(nèi)容顯示規(guī)則。
左側(cè)和上側(cè)的直線決定了圖片的縮放區(qū)域;右側(cè)和下側(cè)的直線決定了圖片內(nèi)容顯示區(qū)域。
RadioButton和CheckBox
RadioButton單選按鈕,一組RadioButton只能選中其中一個(gè),通常要與RadioGroup—
起使用。
CheckBox復(fù)選框
ToggleButton狀態(tài)開關(guān)按鈕和Switch開關(guān)
用于切換程序中的某種狀態(tài)。
AnalogClock和DigitalClock時(shí)鐘
DigitalClock顯示內(nèi)容總是當(dāng)前時(shí)間。
AnalogClock繼承View組件,重寫了View的OnDraw方法,它會(huì)在View上繪制模擬時(shí)鐘。
區(qū)別在于DigitalClock顯示數(shù)字時(shí)鐘,可以顯示當(dāng)前秒數(shù)。AnalogClock顯示模擬時(shí)鐘,
不會(huì)顯示當(dāng)前秒數(shù)。
Chronometer計(jì)時(shí)器
并不顯示當(dāng)前時(shí)間,它顯示的是從某個(gè)起始時(shí)間開始,一共過去了多長(zhǎng)時(shí)間。
ImageView及其子類
主要功能是顯示圖片,任何Drawable對(duì)象都可以使用ImageView來顯示。
ImageButton圖片按鈕
與Button不同的是Button生成的按鈕上顯示文字,而ImageButton上則顯示圖片???/p>
以指定android:src屬性設(shè)置靜態(tài)圖片,也可以使用自定義Drawable對(duì)象來開發(fā)處隨用戶動(dòng)
作改變圖片的按鈕。
QuickContactBadge關(guān)聯(lián)聯(lián)系人
繼承了ImageView,因此它本質(zhì)也是圖片,可以通過android:src屬性指定它顯示的圖
片,額外增加的功能是該圖片可以關(guān)聯(lián)到手機(jī)中指定的聯(lián)系人,當(dāng)用戶單擊圖片時(shí),系統(tǒng)將
會(huì)打開相應(yīng)聯(lián)系人的聯(lián)系方式界面。
AdapterView及子類
具有如下特征:
1.繼承了ViewGroup,本質(zhì)是容器。
2.可以包括多個(gè)列表項(xiàng),并將多個(gè)列表項(xiàng)以合適的形式顯示出來。
3.顯示的多個(gè)列表項(xiàng)由Adapter提供。
ListView和ListActivity
ListView以垂直列表的形式顯示所有列表項(xiàng)。創(chuàng)建ListView有兩種方式:
1.直接使用ListView進(jìn)行創(chuàng)建。
2,讓Activity繼承ListActivity□
一旦獲得ListView之后,就需要為L(zhǎng)istView設(shè)置它要顯示的列表項(xiàng),通過
setAdapter(Adapter)方法為之提供Adapter,并由Adapter提供列表項(xiàng)即可。
Adapter接口及其實(shí)現(xiàn)類
Adapter是一個(gè)接口,派生與ListAdapter和SpinnerAdapter兩個(gè)子接口。
Adaptei■常用的實(shí)現(xiàn)類如下:
1.ArrayAdapter:用于數(shù)組或List集合的多個(gè)值包裝成多個(gè)列表項(xiàng)。
2.SimpleAdapter:用于將List集合的多個(gè)對(duì)象包裝成多個(gè)列表項(xiàng)。
3.SimpleCursorAdapter:用于包裝Cursor提供的數(shù)據(jù)。
4.BaseAdapter:通常用于擴(kuò)展??梢詫?duì)各項(xiàng)列表項(xiàng)進(jìn)行最大限度的定制。
?創(chuàng)建ArrayAdapter時(shí)必須指定3個(gè)參數(shù):
1.Context:代表訪問整個(gè)Android應(yīng)用的接口。
2.textViewResourceld:一個(gè)資源ID,代表一個(gè)TextView,該組件將作為ArrayAdapter
的列表項(xiàng)組件。
3.數(shù)組或List:負(fù)責(zé)為多個(gè)列表項(xiàng)提供數(shù)據(jù)。
?創(chuàng)建SimpleAdapter時(shí)需要5個(gè)參數(shù)
1.Context
2.一個(gè)List<?extendsMap<String,?>>類型的集合對(duì)象,該集合中的每個(gè)
Map<String,?>對(duì)象生成一個(gè)列表項(xiàng)。
3.一個(gè)界面布局ID,該界面將作為列表項(xiàng)組件。
4.一個(gè)String口類型的參數(shù),該參數(shù)決定提取Map<String,?>對(duì)象中哪些key對(duì)應(yīng)value
來生成列表項(xiàng)。
5.一個(gè)int[]類型的參數(shù),該參數(shù)決定填充哪些組件。
如果需要監(jiān)聽用戶單擊,選中某個(gè)列表項(xiàng)事件,可通過Ad叩terView的
setOnltemClickListener()方法為單擊事件添加監(jiān)聽器,或通過
setOnltemSelectedListener()方法為列表項(xiàng)的選中事件添加監(jiān)聽器。
?通過擴(kuò)展BaseAdapter來實(shí)現(xiàn)Adapter,可以取得對(duì)Adapter最大的控制權(quán):程序
要?jiǎng)?chuàng)建多少個(gè)列表項(xiàng),每個(gè)列表項(xiàng)的組件由開發(fā)者決定。創(chuàng)建一個(gè)BaseAdapter對(duì)
象,擴(kuò)展該對(duì)象需要重寫如下4個(gè)方法:
1.getCount():該方法的返回值控制該Adapter將會(huì)包含多少個(gè)列表項(xiàng)。
2.getltem(intposition):該方法的返回值決定第position處的列表項(xiàng)內(nèi)容。
3.getltemld(intposition):該方法的返回值決定第position處的列表項(xiàng)ID0
4.getView(intposition.ViewconvertView,ViewGroupparent):該方法的返回值決定第
position處的列表項(xiàng)組件。
自動(dòng)完成文本框AutoCompleteTextView
當(dāng)用戶輸入一定字符之后,自動(dòng)完成文本框會(huì)顯示一個(gè)下拉菜單,供用戶選擇,當(dāng)用戶
選擇某個(gè)菜單項(xiàng)之后,它按用戶選擇自動(dòng)填寫該文本框。它還派生了一個(gè)子類:
MultiAutoCompleteTextView,該子類允許輸入多個(gè)提示項(xiàng),多個(gè)提示項(xiàng)以分隔符分隔。
使用方法:
1.在布局文件中定義自動(dòng)完成文本框組件。
2.為它們綁定一個(gè)Adapter。
3.可以為MultiAutoCompleteTextView設(shè)置分隔符。
網(wǎng)格視圖GridView
用于在界面上按行,列分布的方式來顯示多個(gè)組件。它和ListView不同在于,ListView
只顯示一列,而GridView可以顯示多列,同樣需要通過Adapter來提供顯示數(shù)據(jù)。
可展開的列表組件ExpandableListView
它把應(yīng)用中的列表項(xiàng)分成幾組,每組里又可包含多個(gè)列表項(xiàng)。所顯示的列表項(xiàng)應(yīng)該由
ExpandableListAdapter提供。
實(shí)現(xiàn)ExpandableListAdapter也有如下3種常用方式:
1.擴(kuò)展BaseExpandableListAdapter實(shí)現(xiàn)ExpandableListAdapter,關(guān)鍵是實(shí)現(xiàn)如下4
個(gè)方法:
?getGroupCount。返回包含的組列表項(xiàng)的數(shù)量。
?getGroupView。返回的View對(duì)象將作為組列表項(xiàng)。
?getChildrenCount()返回特定組所包含的子列表項(xiàng)的數(shù)量。
?getChildView()返回的View對(duì)象將作為特定組,特定位置的子列表項(xiàng)。
2.使用SimpleExpandableListAdapter將兩個(gè)List集合包裝成ExpandableListAdapter0
3,使用SimpleCursorTreeAdapter將Cursor種數(shù)據(jù)包裝成SimpleCursorTreeAdaptero
Spinner的功能與用法
一個(gè)列表選擇框,并不是需要顯示下拉列表,而是相當(dāng)于彈出一個(gè)菜單供用戶選擇。可
以指定android:entries屬性來提供顯示數(shù)據(jù),或用Adapter的方式來提供顯示數(shù)據(jù)。
畫廊視圖Grllery
顯示的是一個(gè)水平的列表選擇框。允許用戶通過拖動(dòng)來查看上一個(gè),下一個(gè)列表項(xiàng)。只
要為它提供一個(gè)內(nèi)容Adapter即可,該Adapter的getView()方法所返回的View將作為
Gallery列表的列表項(xiàng)。
Ad叩terViewFlipper的功能與用法
繼承了AdapterViewAnimator,它也會(huì)顯示Adapter提供的多個(gè)View組件,但它每次
只能顯示一個(gè)View組件,程序可以控制該組件顯示上一個(gè),下一個(gè)組件,可以在多個(gè)View
切換過程中使用漸隱漸顯的動(dòng)畫效果。
StackView的功能與用法
它用于顯示Adapter提供的系列View,它將會(huì)以堆疊的方式來顯示多個(gè)列表項(xiàng)。它提
供了如下兩種控制方式:
1.拖走StackView中處于頂端的View,下一個(gè)View將會(huì)顯示出來。將上一個(gè)View拖進(jìn)
StackView,將使之顯示出來。
2,通過調(diào)用StackView的showNext(),showPrevious()控制顯示下一個(gè),上一^組件。
ProgressBar的功能與用法
Android支持多種風(fēng)格的進(jìn)度條,通過style屬性可以為其指定風(fēng)格。還提供如下方法
來操作進(jìn)度:
1.setProgress(int)設(shè)置進(jìn)度條的完成百分比。
2.incrementPorgressBy(int)設(shè)置進(jìn)度條進(jìn)度增加或減少。當(dāng)參數(shù)為正數(shù)時(shí)進(jìn)度增加,當(dāng)參
數(shù)為負(fù)數(shù)時(shí)進(jìn)度減少。
還有一種進(jìn)度條,可以直接在窗口標(biāo)題上顯示,需要如下兩個(gè)步驟:
1.調(diào)用Activity的requestWindowFeature。方法,該方法根據(jù)傳入的參數(shù)可啟用特定
的窗口特征,傳入Window.FEATUREJNDETERMINATE_PROGRESS在窗口標(biāo)題上顯
示不帶進(jìn)度的進(jìn)度條,傳入Window.FEATURE_PROGRESS則顯示帶進(jìn)度的進(jìn)度條。
2.調(diào)用Activity的setProgressBarVisibility(Boolean)或
setProgressBarlndeterminateVisibility(Boolean)方法即可控制進(jìn)度條的顯示與隱藏。
拖動(dòng)條SeekBar的功能與用法
可以拖動(dòng)滑塊來改變值,通常用于對(duì)系統(tǒng)的某種數(shù)值進(jìn)行調(diào)節(jié)??梢酝ㄟ^指定
android:thumb的屬性來改變拖動(dòng)條的滑塊外觀
星級(jí)評(píng)分條RatingBar的功能與用法
通過星星來表示進(jìn)度的特殊進(jìn)度條。
Viewswitcher的功能與用法
是一個(gè)視圖切換組件,繼承FrameLayout,可以將多個(gè)View層疊在一起,每次只顯示
一個(gè)組件。當(dāng)程序控制從一個(gè)View切換到另一個(gè)View時(shí),可以支持指定動(dòng)畫效果。為了給
ViewSwitcher添加多個(gè)組件,一般通過調(diào)用setFactory(ViewSwticher.ViewFactory)方法為之
設(shè)置ViewFactory,并由該ViewFactory為之創(chuàng)建View即可。
圖像切換器ImageSwitcher
繼承ViewSwitcher,可以切換View組件時(shí)使用動(dòng)畫效果。使用它只需要2步:
1.為ImageSwitcher提供一個(gè)ViewFactory,該ViewFactory生成的View組件必須是
ImageVieWo
2,需要切換圖片時(shí),只要調(diào)用ImageSwitcher的setlmageDrawable(Drawabledrawable),
setlmageResource(intresid)和setlmageURI(Uriuir)方法更換圖片即可。
文本切換器TextSwitcher
繼承ViewSwitcher,可以切換View組件時(shí)使用動(dòng)畫效果,也要設(shè)置一個(gè)ViewFactory,
該ViewFactory的makeView。方法必須返回一個(gè)TextView。
ViewFilpper功能與用法
繼承ViewAnimator,可以調(diào)用addView(Viewv)添加多個(gè)組件,可以使用動(dòng)畫控制多個(gè)
組件的切換效果。它與AdapterViewFlipper的區(qū)別是ViewFlipper需要開發(fā)者通過addView()
添加多個(gè)View,而AdapterViewFlipper則只要傳入一個(gè)Adapter,adapter將會(huì)負(fù)責(zé)提供多
個(gè)Viewo
使用Toast顯示提示信息框
它具有如下特征:
1.提示信息不會(huì)獲得焦點(diǎn)
2.提示信息過一段時(shí)間會(huì)自動(dòng)消失
使用步驟:
1.調(diào)用Toast的構(gòu)造器或makeText()靜態(tài)方法創(chuàng)建一個(gè)Toast對(duì)象。
2.調(diào)用Toast的方法來設(shè)置該消息提示的對(duì)齊方式,頁邊距等。
3,調(diào)用Toast的show。方法將它顯示出來。
如果需要顯示諸如圖片,列表之類的復(fù)雜提示,則調(diào)用Toast構(gòu)造器創(chuàng)建實(shí)例,再調(diào)用
setView()方法設(shè)置該Toast顯示的View組件。
日歷視圖CalendarView
可用于顯示和選擇日期,用戶既可以選擇一個(gè)日期,也可通過觸摸來滾動(dòng)曰歷??梢哉{(diào)
用該組件的setOnDateChangeListener。方法為此組件添加點(diǎn)擊事件監(jiān)聽器。
日期,時(shí)間選擇器DatePicker和TimePicker
DatePicker可用于選擇日期,TimePicker可用于選擇時(shí)間。
數(shù)值選擇器NumberPicker
用于讓用戶輸入數(shù)值,用戶既可以通過鍵盤輸入數(shù)值,也可以通過拖動(dòng)來選擇數(shù)值。
搜索框SearchView
可以讓用戶在文本框內(nèi)輸入文字,并允許通過監(jiān)聽器監(jiān)控用戶輸入,當(dāng)用戶輸入完成后
提交搜索時(shí),也可以通過監(jiān)聽器執(zhí)行實(shí)際搜索。
選項(xiàng)卡TabHost
可以很方便地在窗口上放置多個(gè)標(biāo)簽頁,每個(gè)標(biāo)簽頁相當(dāng)于獲得一個(gè)與外部容器相同大
小的組件擺放區(qū)域。通過這種方式,就可以在一個(gè)容器里放置更多組件。
與TabHost結(jié)合使用的還有如下組件:
1.TabWidget:選項(xiàng)卡的標(biāo)簽條
2.TabSpec:選項(xiàng)卡的一個(gè)Tab頁面
TabHost僅僅是個(gè)容器,它提供如下兩個(gè)方法創(chuàng)建,添加選項(xiàng)卡
1.newTabSpec:創(chuàng)建選項(xiàng)卡
2.addTab(TabHost.TabSpectabSpec):添力口選項(xiàng)卡
使用TabHost的一般步驟如下:
1.在界面布局中定義TabHost組件,并為組件定義該選項(xiàng)卡的內(nèi)容。
應(yīng)該繼承
2.ActivityTabActivityo
3,調(diào)用TabActivity的getTabHost()方法獲取TabHost對(duì)象。
4.通過TabHost對(duì)象的方法創(chuàng)建,添加選項(xiàng)卡。
滾動(dòng)視圖ScrollView
用于為普通組件添加滾動(dòng)條的組件,該組件里最多只能包含一個(gè)組件,而它的作用就是
為該組件添加垂直滾動(dòng)條。默認(rèn)是垂直的滾動(dòng)條,如果要使用水平滾動(dòng)條則要使用
HorizontalScrollVieWo
Notification的功能與用法
是顯示在手機(jī)狀態(tài)欄的通知。程序一般通過NotificationManager服務(wù)來發(fā)送
Notification。發(fā)送Notification需要按如下步驟:
1,調(diào)用getSystemSerive(NCTnFICATION_SERVICE)方法獲取系統(tǒng)的NotificationManager月艮
務(wù)。
2.通過構(gòu)造器創(chuàng)建一個(gè)Notification對(duì)象。
3,為Notification設(shè)置各種屬性。
4.通過NotificationManager發(fā)送Notification。
對(duì)話框
Android提供了4種常用對(duì)話框
1.AlertDialog:實(shí)際應(yīng)用最廣的對(duì)話框
2.ProgressDialog:進(jìn)度對(duì)話框
3.DatePickerDialog:日期選擇對(duì)話框
4.TimePickerDialog:時(shí)間選擇對(duì)話框
使用AlertDialog對(duì)話框的幾個(gè)步驟:
1,使用創(chuàng)建AlertDialog.Builder對(duì)象。
2.調(diào)用AlertDialog.Builder的setTitle?;騭etCustomTitle。方法設(shè)置標(biāo)題。
3,調(diào)用AlertDialog.Builder的setlcon。方法設(shè)置圖標(biāo)。
4.調(diào)用AlertDialog.Builder的相關(guān)設(shè)置方法設(shè)置對(duì)話框內(nèi)容。
5.調(diào)用AlertDialog.Builder的setPositiveButton(),setNegativeButton或
setNeutralButton()方法添加多個(gè)按鈕。
6.調(diào)用AlertDialog.Builder的create。方法創(chuàng)建AlertDialog對(duì)象,再調(diào)用AlertDialog
對(duì)象的show()方法將該對(duì)話框顯示出來。
其中第4步中的設(shè)置方法有如下6種:
1.setMessage()設(shè)置對(duì)話內(nèi)容為簡(jiǎn)單文本內(nèi)容。
2.setltems()設(shè)置對(duì)話框內(nèi)容為簡(jiǎn)單列表項(xiàng)。
3.setSingleChoiceltems。設(shè)置對(duì)話框內(nèi)容為單選列表項(xiàng)。
4.setM3tiChoiceltems()設(shè)置對(duì)話框內(nèi)容為多選列表項(xiàng)。
5.setAdapter。設(shè)置對(duì)話框內(nèi)容為自定義列表項(xiàng)。
6.setView()設(shè)置對(duì)話框內(nèi)容為自定義View。
PopupWindow
可以創(chuàng)建類似對(duì)話框風(fēng)格的窗口,只要如下兩步即可:
1.調(diào)用PopupWindow的構(gòu)造器創(chuàng)建對(duì)象。
2,調(diào)用PopupWindow的showAsDropDown(Viewv)將PopupWindow作為v的組件的下
拉組件顯示出來,或調(diào)用showAtLocation。方法將PopupWindow在指定位置顯示出來。
使用DatePickerDialog,TimeTickerDialog
使用它們只需2步:
1.通過new關(guān)鍵字創(chuàng)建DatePickerDialog,TimePickerDialog實(shí)例,調(diào)用它們的show。方
法即可將日期選擇對(duì)話框,時(shí)間選擇對(duì)話框顯示出來。
2.為DatePickerDialog,TimePickerDialog綁定監(jiān)聽器。
使用ProgressDialog創(chuàng)建進(jìn)度對(duì)話框
創(chuàng)建進(jìn)度對(duì)話框有如下兩種方式:
1.如果只是創(chuàng)建簡(jiǎn)單的進(jìn)度對(duì)話框,調(diào)用ProgressDialog提供的show()方法顯示對(duì)話框
即可。
2.創(chuàng)建ProgressDialog,然后調(diào)用方法對(duì)對(duì)話框里的進(jìn)度條進(jìn)行設(shè)置,設(shè)置完成后將對(duì)話
框顯示出來。
菜單
Menu接口只是一個(gè)父接口,它有如下兩個(gè)子接口:
1.SubMenu:代表一個(gè)子菜單。
2.ContextMenu:代表一?"上下文菜單。
添加菜單或子菜單的步驟如下:
1.重寫Activity的onCreateOptionsMenu(Menumenu)的方法,在該方法里調(diào)用Menu對(duì)
象的方法來添加菜單項(xiàng)或子菜單。
2.如果希望應(yīng)用程序能響應(yīng)菜單項(xiàng)的點(diǎn)擊事件,重寫Activity的
onOptionltemSelected(Menultemmi)方法即可。
使用監(jiān)聽器來監(jiān)聽菜單事件
可以為不同菜單分別綁定監(jiān)聽器,使用
setOnMenultemClickListener(Menultem.OnMenultemClickListenermenultemClickListener)來
綁定監(jiān)聽器。但通過為每個(gè)菜單綁定監(jiān)聽器會(huì)使代碼更為臃腫,因此一般不推薦為每個(gè)慘淡
分別綁定監(jiān)聽器。
創(chuàng)建復(fù)選菜單項(xiàng)和單選菜單項(xiàng)
setCheckable(Booleancheckable)設(shè)置該菜單項(xiàng)是否可以勾選。
setGroupCheckable(intgroup,booleancheckable,booleanexclusive)設(shè)置group組里的所有
菜單項(xiàng)是否可勾選,如果exclusive為true,那么它們將是一組單選菜單項(xiàng)。
設(shè)置于菜單項(xiàng)關(guān)聯(lián)的Activity
只要調(diào)用Menuitem的setlntent(lntentintent)方法即可,該方法把菜單項(xiàng)與指定Intent
關(guān)聯(lián)到一起,當(dāng)用戶單擊該菜單項(xiàng)時(shí),該Intent所代表的組件將會(huì)啟動(dòng)。
上下文菜單
開發(fā)上下文菜單的步驟如下:
1.重寫Activity的OnCreateContextMenu(ContextMenumenu,View
source,ContextMenu.ContextMenuInfomenuinf。)方法。
2.調(diào)用Activity的registerForContextMenu(Viewview)方法為view組件注冊(cè)上下文菜單。
3.如果希望應(yīng)用程序能為菜單項(xiàng)提供響應(yīng),可以重寫onContextltemSelected(Menultem
mi)方法,或?yàn)橹付ú藛雾?xiàng)綁定監(jiān)聽器。
使用XML文件定義菜單
菜單資源通常應(yīng)該放在/res/menu目錄下,菜單資源的根元素通常是〈menu…/>元素,
〈menu…/>元素?zé)o須指定任何屬性?!磎enu…/>元素內(nèi)可包含如下元素:
1.〈item…/>:定義菜單項(xiàng),(item…/>元素又可包含〈menu…/>元素,位于〈item…/>元素
內(nèi)部的〈menu…/>就代表了子菜單。
2.〈group…/>:將多個(gè)〈item…/>定義的菜單包裝成一個(gè)菜單組,它用于控制整組菜單的
行為。
在程序中定義了資源后,接下來重寫onCreateOptionsMenu(用于創(chuàng)建選項(xiàng)菜單),
onCreateContextMenu(用于創(chuàng)建上下文菜單)方法,在這些方法種調(diào)用Menulnflater對(duì)象的
inflate方法裝載指定資源對(duì)應(yīng)的菜單即可。
使用XML資源定義菜單的好處:
1.XML資源文件不僅負(fù)責(zé)定義界面,也負(fù)責(zé)定義菜單,這樣可把所有界面相關(guān)的內(nèi)容交
給XML文件管理,而Java代碼的功能更集中。
2.后期更新,維護(hù)應(yīng)用時(shí),如果需要更新,維護(hù)菜單,打開,編輯XML文件即可,避免
對(duì)Java文件的修改。
使用PopuoMenu創(chuàng)建彈出式菜單
它會(huì)在指定組件上彈出PopupMenu,默認(rèn)情況下,PopupMenu會(huì)顯示在該組件的下方
或上方。可增加多個(gè)菜單項(xiàng),并可為菜單項(xiàng)添加子菜單。
創(chuàng)建PopupMneu菜單的步驟如下:
1.調(diào)用newPopupMenu(Contextcontext,Viewanchor)創(chuàng)建下拉菜單,anchor代表要激發(fā)
該彈出菜單的組件。
2,調(diào)用Menulnflater的inflate。方法將菜單資源填充到PopupMenu中。
3.調(diào)用PopupMenu的show。方法顯示彈出式菜單。
使用活動(dòng)條ActionBar
位于傳統(tǒng)標(biāo)題欄的位置,也就是顯示的屏幕的頂部。它可顯示應(yīng)用的圖標(biāo)和Activity標(biāo)
題,也就是前面應(yīng)用程序的頂部顯示的內(nèi)容,除此之外,ActionBar的右邊還可以顯示活動(dòng)
項(xiàng)。歸納起來,ActionBar提供如下功能:
1.顯示選項(xiàng)菜單的菜單項(xiàng)(將菜單項(xiàng)顯示成ActionItem)。
2.使用程序圖標(biāo)作為返回HOME主屏或向上的導(dǎo)骯操作。
3.提供交互式View作為ActionView。
4.提供基于Tab的導(dǎo)航方式,可用于切換多個(gè)Fragment。
5.提供基于下拉的導(dǎo)航方式。
Android3.0版本已經(jīng)默認(rèn)啟用了ActionBar,只要在AndroidManifest.xml文件的SDK配
置中指定了該應(yīng)用的目標(biāo)版本高于11,那么默認(rèn)就會(huì)啟用ActionBaro
使用ActionBar顯示選項(xiàng)菜單
為了解決手機(jī)不再強(qiáng)制提供MENU按鍵,導(dǎo)致用戶無法打開選項(xiàng)菜單的問題,Android
提供了ActionBar作為解決方案,ActionBar可以將選項(xiàng)菜單顯示成Actionitem。Android3.0
開始,Menuitem新增了如下方法:
setShowAsAction(intactionEnum):該方法設(shè)置是否將該菜單項(xiàng)顯示在ActionBar上,作為
Actionitemo該方法支持如下參數(shù)值:
1.SHOW_AS_ACTION_ALWAYS:總是將該Menuitem顯示在ActionBar上。
2.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW:將該ActionView折疊成普通菜單項(xiàng)。
3.SHOW_AS_ACTION_IF_ROOM:當(dāng)ActionBar位置足夠時(shí)才顯示Menuitem。
4.SH0W_AS_ACTI0N_NEVER:不將該Menuitem顯示在ActionBar上。
5.SHOW_AS_ACTION_WITH_TEXT:將該Menuitem顯示在ActionBar上,并顯示該菜單
項(xiàng)的文本。
允許在XML菜單資源文件中為〈item…/>元素指定如下屬性:
android:showAsAction:該屬性值的作為類似于setShowAsAction(intactionEnum)。
啟動(dòng)程序圖標(biāo)導(dǎo)航
為了將應(yīng)用程序圖標(biāo)轉(zhuǎn)換為可點(diǎn)擊的圖標(biāo),可調(diào)用ActionBar的如下方法:
1.setDisplayHomeAsUpEnabled(BooleanshowHomeAsUp):設(shè)置是否將應(yīng)用程序圖標(biāo)轉(zhuǎn)
變成可點(diǎn)擊的圖標(biāo),并在圖標(biāo)上添加一個(gè)向左箭頭。
2.setDisplayOptions(intoptions)通過傳入int類型常量來控制該ActionBar的顯示選項(xiàng)。
3.setDispl;ayShowHomeEnabled(BooleanshowHome):設(shè)置是否顯示應(yīng)用程序的圖標(biāo)。
4.setHomeButtonEnabled(Boolear)enabled):設(shè)置是否將應(yīng)用程序圖標(biāo)轉(zhuǎn)變成可點(diǎn)擊的按
鈕。
添加ActionView
ActionBar除了可以顯示普通的ActionItem外,還可以顯示普通的UI組件。為了在
ActionBar上添加ActionView,可以用如下兩種方式:
1,定義ActionItem時(shí)使用android:actionViewClass屬性指定ActionView的實(shí)現(xiàn)類。
2,定義ActionItem時(shí)使用android:actionLayout屬性指定ActionView對(duì)應(yīng)的視圖資源。
使用ActionBar實(shí)現(xiàn)Tab導(dǎo)航
ActionBar在頂端生成多個(gè)Tab標(biāo)簽,當(dāng)用戶點(diǎn)擊某個(gè)Tab標(biāo)簽時(shí),系統(tǒng)根據(jù)用戶點(diǎn)擊
事件導(dǎo)航指定Tab頁面。按如下步驟進(jìn)行即可:
1,調(diào)用ActionBar的setNavigationMode(ActionBar.NAVIGATION_MODE_TABS)方法設(shè)置
使用tab導(dǎo)航方式。
2.調(diào)用ActionBar的addTab()方法添加多個(gè)tab標(biāo)簽,并為每個(gè)標(biāo)簽添加事件監(jiān)聽器。
Fragment簡(jiǎn)介
Fragment相當(dāng)于Activity片段,通常單獨(dú)的Activity組合多個(gè)Fragment,這樣即可在一
個(gè)Activity創(chuàng)建多個(gè)用戶界面。除此之外,也可以多個(gè)Activity復(fù)用同一個(gè)Fragment??傊?/p>
Fragment相當(dāng)于Activity的模擬區(qū)域。
使用ActonBar實(shí)現(xiàn)下拉式導(dǎo)航
ActionBar除可提供Tab導(dǎo)航支持之外,還提供了下拉式導(dǎo)航方式。下拉式導(dǎo)航的
ActionBar在頂端生成下拉列表框,當(dāng)用戶單擊某個(gè)列表項(xiàng)時(shí),系統(tǒng)根據(jù)用戶單擊事件導(dǎo)航
指定的Fragmento實(shí)現(xiàn)它按如下步驟即可:
1.調(diào)用ActionBar的actionBar.setNavigationMode(ActionBar.NAVIGACTON_MODE_LIST)
方法設(shè)置使用下拉列表的導(dǎo)航方式。
2.調(diào)用ActionBar的setListNavigationCallbacks(SpinnerAdapter
adapter,ActionBar.onNavigationListenercallback)。添加多個(gè)列表項(xiàng),并為每個(gè)列表項(xiàng)設(shè)
置監(jiān)聽器。
Android的事件處理
目錄
Android的事件處理13
基于監(jiān)聽的事件處理13
基于回調(diào)的事件處理14
響應(yīng)系統(tǒng)設(shè)置的事件15
Handler消息傳遞機(jī)制15
異步任務(wù)(AsyncTask)16
兩套事件處理機(jī)制:
1.基于監(jiān)聽的事件處理
可以在界面布局文件中android:onClick屬性指定事件監(jiān)聽方法。
2.基于回調(diào)的事件處理
主要是重寫組件特定的回調(diào)方法,或重寫Activity的回調(diào)方法。
基于監(jiān)聽的事件處理
在事件監(jiān)聽的處理模型中,主要涉及如下三類對(duì)象:
1.Eventsource事件源:事件發(fā)生的場(chǎng)所,通常是各個(gè)組件。
2.Event事件:事件封裝了界面組件上發(fā)生的特定事情。如果程序需要獲得界面組件上所
發(fā)生事件的相關(guān)信息,一般通過Event對(duì)象來取得。
3.EventListener事件監(jiān)聽器:負(fù)責(zé)監(jiān)聽事件源所發(fā)生的事件,并對(duì)各種事件做出相應(yīng)的響
應(yīng)。
Android的事件處理機(jī)制是一種委派式事件處理方式:普通組件(事件源)將整個(gè)事件
處理委托給特定的對(duì)象(事件監(jiān)聽器);當(dāng)該事件源發(fā)生特定的事件時(shí),就通知所委托的事
件監(jiān)聽器,由事件監(jiān)聽器來處理這個(gè)事件。
基于監(jiān)聽的事件處理模型的編程步驟如下:
1,獲取普通界面組件(事件源),也就是被監(jiān)聽的對(duì)象。
2.實(shí)現(xiàn)事件監(jiān)聽器類,該監(jiān)聽器類是一個(gè)特殊的Java類,必須實(shí)現(xiàn)一個(gè)xxxListener接口。
3.調(diào)用事件源的setXxxListener方法將事件監(jiān)聽器對(duì)象注冊(cè)給普通組件(事件源)。
事件與事件監(jiān)聽器
如果事件源觸發(fā)的事件足夠簡(jiǎn)單,事件里封裝的信息比較有限,那就無須封裝事件對(duì)象,
將事件對(duì)象傳入事件監(jiān)聽器。但對(duì)于鍵盤事件,觸摸事件等,此時(shí)程序需要獲取事件發(fā)生的
詳細(xì)信息,對(duì)于這種包含更多信息的事件,Android同樣會(huì)將事件信息封裝成XxxEvent對(duì)
象,并把該對(duì)象作為參數(shù)傳入事件處理器。
在程序中實(shí)現(xiàn)事件監(jiān)聽器,通常有如下幾種形式:
1.內(nèi)部類形式:將事件監(jiān)聽器類定義成當(dāng)前類的內(nèi)部類。
2.外部類形式:將事件監(jiān)聽器定義為一個(gè)外部類。
3.Activity本身作為事件監(jiān)聽器:讓Activity本身實(shí)現(xiàn)監(jiān)聽器接口,并實(shí)現(xiàn)事件處理方
法。
4.匿名內(nèi)部類形式:使用匿名內(nèi)部類創(chuàng)建事件監(jiān)聽器對(duì)象。
內(nèi)部類作為事件監(jiān)聽器類
使用內(nèi)部類可以在當(dāng)前類中復(fù)用該監(jiān)聽器;因?yàn)楸O(jiān)聽器是外部類的內(nèi)部類,所以可以自
由訪問外部類的所有界面組件。
外部類作為事件監(jiān)聽器類
使用外部類定義事件監(jiān)聽器類的形式比較少見,主要因?yàn)槿缦聝蓚€(gè)原因:
1.事件監(jiān)聽器通常屬于特定的GUI界面,定義成外部類不利于提高程序的內(nèi)聚性.
2.外部類形式的事件監(jiān)聽器不能自由訪問創(chuàng)建GUI界面的類中的組件,編程不夠簡(jiǎn)潔。
但如果某個(gè)事件監(jiān)聽器確實(shí)需要被多個(gè)GUI界面所共享,而且主要是完成某種業(yè)務(wù)邏
輯的實(shí)現(xiàn),則可以考慮使用外部類的形式來定義事件監(jiān)聽器類。
Activity本身作為監(jiān)聽器
這種形式非常簡(jiǎn)潔,但這種做法有兩個(gè)缺點(diǎn):
1.這種形式可能造成程序結(jié)構(gòu)混亂,Activity的主要職責(zé)應(yīng)該是完成界面初始化工作,但
此時(shí)還需包含事件處理器方法,從而引起混亂。
2.如果Activity界面類需要實(shí)現(xiàn)監(jiān)聽器接口,讓人感覺比較怪異。
匿名內(nèi)部類作為事件監(jiān)聽器類
因大部分事件監(jiān)聽器只是臨時(shí)使用一次,所以使用匿名內(nèi)部類形式的事件監(jiān)聽器更合適。
直接綁定到標(biāo)簽
直接在界面布局文件中指定標(biāo)簽綁定事件處理方法。許多組件都支持。nClick屬性,該
屬性的屬性值就是一個(gè)形如xxx(Viewsource)的方法的方法名。
基于回調(diào)的事件處理
如果說事件監(jiān)聽機(jī)制是一種委托式的事件處理,那么回調(diào)機(jī)制則恰好與之相反。對(duì)于基
于回調(diào)的事件處理模型來說,事件源與事件監(jiān)聽器是統(tǒng)一的,或者說事件監(jiān)聽器完全消失了。
在用戶在GUI組件上激發(fā)某個(gè)事件時(shí),組件自定特定的方法將會(huì)負(fù)責(zé)處理該事件。
而Java又是一種靜態(tài)語言,我們無法為某個(gè)對(duì)象動(dòng)態(tài)的添加方法,因此只能繼承GUI
組件類,并重寫該類的事件處理方法來實(shí)現(xiàn)。
基于回調(diào)的事件傳播
幾乎所有基于回調(diào)的事件處理方法都有一個(gè)boolean類型的返回值,該返回值用于標(biāo)
識(shí)該處理方法是否能完全處理該事件:
1.如果返回true,表明該處理方法已完全處理該事件,該事件不會(huì)傳播出去。
2.如果返回false,表明該處理方法并未完全處理該事件,該事件會(huì)傳播出去。
當(dāng)該組件上發(fā)生某個(gè)按鍵被按下的事件時(shí),系統(tǒng)最先觸發(fā)的應(yīng)該是該按鍵上綁定的事件
監(jiān)聽器,接著才觸發(fā)該組件提供的事件回調(diào)方法,然后還會(huì)傳播到該組件所在的Activityo
重寫onTouchEvent方法響應(yīng)觸摸屏事件
基于回調(diào)的事件處理更適合應(yīng)付那種事件處理邏輯比較固定的View。
響應(yīng)系統(tǒng)設(shè)置的事件
Configruation類
專門用于描述手機(jī)設(shè)備上的配置信息,這些配置信息既包括用戶特定的配置項(xiàng),也包括
系統(tǒng)的動(dòng)態(tài)設(shè)備配置。
重寫onConfigurationChanged響應(yīng)系統(tǒng)設(shè)置更改
如果需要監(jiān)聽系統(tǒng)設(shè)置的更改,則可以考慮重寫
onConfigurationChanged(ConfigurationnewConfig)方法,該方法是一^基于回調(diào)的事件處
理方法:當(dāng)系統(tǒng)設(shè)置發(fā)生更改時(shí),該方法會(huì)被自動(dòng)觸發(fā)。
為了讓Activity能監(jiān)聽設(shè)置更改事件,需要在配置該Activity時(shí)指定
anroid:configChanges屬性,該屬性可以支持很多設(shè)置屬性值。
Handler消息傳遞機(jī)制
Android的UI操作并不是線程安全的,這意味著如果有多個(gè)線程并發(fā)操作UI組件,可
能導(dǎo)致線程安全問題,為了解決這個(gè)問題,Android制定了一條簡(jiǎn)單的規(guī)則:只允許UI線程
修改Activity里的UI組件。
Android的消息傳遞機(jī)制是另一種形式的“事件處理”,這種機(jī)制主要為了解決Android
應(yīng)用的多線程問題,Android平臺(tái)只允許UI線程修改Activity里的UI組件,這樣就會(huì)導(dǎo)致
新啟動(dòng)的線程無法動(dòng)態(tài)改變界面組件的屬性值。但在實(shí)際Android應(yīng)用開發(fā)中,尤其是涉及
動(dòng)畫的游戲開發(fā)中,需要讓新啟動(dòng)的線程周期性地改變界面組件的屬性值,這就需要借助
Handler的消息傳遞機(jī)制來實(shí)現(xiàn)了。
Handler的主要作用有兩個(gè):
1.在新啟動(dòng)的線程中發(fā)送消息。
2.在主線程中獲取,處理消息。
為了讓主線程適時(shí)地處理新啟動(dòng)的線程所發(fā)送的消息,顯然只能通過回調(diào)的方式來實(shí)現(xiàn),
開發(fā)者只要重寫Handler類中的處理消息的方法,當(dāng)新啟動(dòng)的線程發(fā)送消息時(shí),消息會(huì)發(fā)送
到與之關(guān)聯(lián)的消息隊(duì)列,而Handler會(huì)不斷地從消息隊(duì)列中獲取并處理消息,這就導(dǎo)致
Handler類中的處理消息的方法被回調(diào)。
Handler,Loop,MessageQueue的工作原理
與Handler一起工作的幾個(gè)組件:
1.Message:Handler接收和處理的消息對(duì)象。
2.Looper:每個(gè)線程只能擁有一個(gè)Looper。它的loop方法負(fù)責(zé)讀取MessageQueue中的
消息,讀到信息后就把消息交給發(fā)送該消息的Handler進(jìn)行處理。
3.MessageQueue:消息隊(duì)列,它采用先進(jìn)先出的方式來管理Message。程序創(chuàng)建Looper
對(duì)象時(shí)會(huì)在它的構(gòu)造器中創(chuàng)建Looper對(duì)象。
Handler:它的作用是發(fā)送消息和處理消息,程序使用Handler發(fā)送消息,被Handler發(fā)
送的消息必須被送到指定的MessageQueue。也就是說,如果希望Handler正常工作,必須
在當(dāng)前線程中有一個(gè)MessageQueue,否則消息就沒有MessageQueue進(jìn)行保存了。不過
MessageQueue是由Looper負(fù)責(zé)管理的,也就是說,如果希望Handler正常工作,必須在
當(dāng)前線程中有一個(gè)Looper對(duì)象。為了保證當(dāng)前線程中有Looper對(duì)象,可以分如下兩種情
況處理:
1.主UI線程中,系統(tǒng)已經(jīng)初始化了一個(gè)Looper對(duì)象,因此程序直接創(chuàng)建Handler即可,
然后就可通過Handler來發(fā)送消息,處理消息。
2.程序員自己?jiǎn)?dòng)的子線程,程序員必須自己創(chuàng)建Looper對(duì)象,并啟動(dòng)它。創(chuàng)建Looper
對(duì)象調(diào)用它的prepare。方法即可。
在線程中使用Handler的步驟如下:
1.調(diào)用Looper的prepare。方法為當(dāng)前線程創(chuàng)建Looper對(duì)象,創(chuàng)建Looper對(duì)象時(shí),它的
構(gòu)造器會(huì)創(chuàng)建與之配套的MessageQueue。
2,有了Looper之后,創(chuàng)建Handler子類的實(shí)例,重寫handleMessage。方法,該方法負(fù)責(zé)
處理來自于其他線程的消息。
3.調(diào)用Looper的loop。方法啟動(dòng)Looper。
異步任務(wù)(AsyncTask)
為了解決新線程不能更新UI組件的問題,Android提供如下幾種解決方案:
1.使用Handler實(shí)現(xiàn)線程之間的通信。
2.Activity.runOnUiThread(Runnable)
3.View.post(Runnable)
4.View.postDelayed(RunnableJong)
2,3,4的方式可能導(dǎo)致編程比較繁瑣,而異步任務(wù)則可進(jìn)一步簡(jiǎn)化這種操作。
一個(gè)抽象類,通常用于被繼承,繼承AsyncTask是需要指定如下三個(gè)泛型參
數(shù):
?Params:啟動(dòng)任務(wù)執(zhí)行的輸入?yún)?shù)類型。
?Progress:后臺(tái)任務(wù)完成的進(jìn)度值的類型。
?Result:后臺(tái)執(zhí)行任務(wù)完成后返回結(jié)果的類型。
使用AsyncTask只要如下3步即可:
1.創(chuàng)建AsyncTask的子類,并為三個(gè)泛型參數(shù)指定類型。如果某個(gè)泛型參數(shù)不需要指定類
型,可將它指定為void。
2.根據(jù)需要,實(shí)現(xiàn)AsyncTask的如下方法:
?dolnBackgroud(Params--)
?onProgressUpdate(Progress-values)
?onPreExecute()
?onPostExecute(Resultresult)
3.調(diào)用AsyncTask子類的實(shí)例execute(Params,params)開始執(zhí)行耗時(shí)任務(wù)。
使用AsyncTask時(shí)必須遵守的規(guī)則:
1.必須在UI線程中創(chuàng)建AsyncTask的實(shí)例。
2.必須在UI線程中調(diào)用AsyncTask的execute。方法。
3.AsyncTask的onPreExecute(),onPostExecute(Resultresult),
dolBackground(Params--params),onProgressUpdate(Progress…values)方法,不應(yīng)該由
程序員代碼調(diào)用,而是由Android系統(tǒng)負(fù)責(zé)調(diào)用。
4.每個(gè)AsyncTask只能被執(zhí)行一次,多次調(diào)用將會(huì)引發(fā)異常。
深入理解Activity與Fragment
目錄
深入理解Activity與Fragment18
Activity是什么18
建立,配置和使用Activity18
啟用,關(guān)閉Activity19
使用Bundle在Activity之間交換數(shù)據(jù)19
啟動(dòng)其他Activity并返回結(jié)果20
Activity的回調(diào)機(jī)制20
Activity的生命周期與加載模式20
Fragment詳解22
Fragment與Activity通信23
Fragment管理與Fragment事務(wù)24
Fragment的生命周期24
Activity是什么
Activity是一個(gè)應(yīng)用程序組件,提供一個(gè)屏幕,用戶可以用來交互為了完成某項(xiàng)任務(wù)。
Activity中所有操作都與用戶密切相關(guān),是一個(gè)負(fù)責(zé)與用戶交互的組件,可以通過
setContentView(View)來顯示指定控件。
在一個(gè)android應(yīng)用中,一個(gè)Activity通常就是一個(gè)單獨(dú)的屏幕,它上面可以顯示一些
控件也可以監(jiān)聽并處理用戶的事件做出響應(yīng)。Activity之間通過Intent進(jìn)行通信。
建立,配置和使用Activity
建立自己的Activity需要繼承Activity基類,創(chuàng)建Activity需要實(shí)現(xiàn)一個(gè)或多個(gè)方法。
LauncherActivity開發(fā)啟動(dòng)Activity的列表
LauncherActivity繼承了ListActivity,它開發(fā)出來的列表界面中每個(gè)列表項(xiàng)都對(duì)應(yīng)一個(gè)
Intent,因此當(dāng)用戶單擊不同的列表項(xiàng)時(shí),應(yīng)用程序會(huì)自動(dòng)啟動(dòng)對(duì)應(yīng)的Activity。需要為它設(shè)
置Adapter數(shù)據(jù),重寫IntentintentForPosition(int),該方法根據(jù)不同列表項(xiàng)返回不同的Intent
(用于啟動(dòng)不同的Activity)。
ExpandableListActivity:用于顯示一個(gè)可展開的列表窗口。
PreferenceActivity:用于顯示一個(gè)顯示設(shè)置選項(xiàng)參數(shù)并進(jìn)行保存的窗口。
創(chuàng)建PreferenceActivity它需要建立選項(xiàng)設(shè)置的布局文件。Android3.0建議將
PreferenceActivity與preferenceFragment結(jié)合使用,PreferenceActivity負(fù)責(zé)加載選項(xiàng)設(shè)置
列表的布局文件,preferenceFragment負(fù)責(zé)加載選項(xiàng)設(shè)置的布局文件。
當(dāng)加載了選項(xiàng)布局文件并建立相應(yīng)的Activity類后,還需要在AndroidManifest.xml清單
文件中配置Activity才能使用Activity類。
最后程序所設(shè)置的參數(shù)將會(huì)保存在/data/data/<應(yīng)用程序包名〉/shared_prefs路徑下,
文件名為〈應(yīng)用程序包g>_preferences.xml。
啟用,關(guān)閉Activity
一個(gè)Android應(yīng)用通常都會(huì)包含多個(gè)Activity,但只有一個(gè)Activity會(huì)作為程序的入口,
當(dāng)該Activity應(yīng)用運(yùn)行時(shí)將會(huì)自動(dòng)啟動(dòng)并執(zhí)行該Activity。至于應(yīng)用中的其他Activity,通常
都由入口Activity啟動(dòng),或由入口Activity啟動(dòng)的Activity啟動(dòng)。
Activity啟動(dòng)其他Activity有如下兩個(gè)方法:
1.startActivity(Intentintent):啟動(dòng)其他Activity。
2.startActivityForResult(lntentintent,intrequestCode):以指定的請(qǐng)求碼來啟動(dòng)Activity,
而且程序?qū)?huì)等到新啟動(dòng)Activity的結(jié)果(通過重寫onActivityResult。方法來獲取),
requestCode參數(shù)的值由開發(fā)者根據(jù)業(yè)務(wù)自行設(shè)置,用于標(biāo)識(shí)請(qǐng)求來源。
關(guān)閉Activity也有如下兩個(gè)方法:
1.finish():結(jié)束當(dāng)前Activity
3.finishActivity(intrequestCode):結(jié)束以startActivityForResult(lntentintent,int
requestCode)方法啟動(dòng)的Activity0
使用Bundle在Activity之間交換數(shù)據(jù)
當(dāng)一個(gè)Activity啟動(dòng)另一個(gè)Activity時(shí),常常會(huì)有一些數(shù)據(jù)需要傳過去。在Activity之間
進(jìn)行數(shù)據(jù)交換更簡(jiǎn)單,因?yàn)閮蓚€(gè)Activity之間本來就有一個(gè)信使Intent,因此我們主要將需
要交換的數(shù)放入Intent即可。
Intent主要通過Bundle對(duì)象來攜帶數(shù)據(jù)。它主要提供了如下方法存取數(shù)據(jù):
1.putXxx(Stringkey.Xxxdata)
2.putSerializable(Stringkey,Serializabledata)
3.getXxx(Stringkey)
4.getSerializable(Stringkey,Serializabledata)
啟動(dòng)其他Activity并返回結(jié)果
Activity提供了一個(gè)startActivityForResult(lntentintent,intrequestCode)方法來啟動(dòng)其他
Activity,,該方法用于啟動(dòng)指定Activity,而且期望獲取指定Activity返回的結(jié)果。它也是通過
Bundle進(jìn)行數(shù)據(jù)交換的,為了獲取被啟動(dòng)的Activity所返回的結(jié)果,需要從兩方面入手:
1.當(dāng)前Activity需要重寫onActivityResult(intrequestCode,intresultCode,Intentintent),當(dāng)
被啟動(dòng)的Activity返回結(jié)果時(shí),該方法將會(huì)被觸發(fā),其中requestCode代表請(qǐng)求碼,而
resultcode代表Activity返回的結(jié)果碼,這個(gè)結(jié)果碼也是由開發(fā)者根據(jù)業(yè)務(wù)自行設(shè)定的。
2.被啟動(dòng)的Activity需要調(diào)用setResult。方法設(shè)置處理結(jié)果。
一個(gè)Activity中可能包含多個(gè)按鈕,并調(diào)用多個(gè)startActivityForResult。方法來打開多個(gè)
不同的Activity處理不同的業(yè)務(wù),當(dāng)這些新的Activity關(guān)閉后,系統(tǒng)都將回調(diào)前面Activity的
onActivityResult(intrequestCode,intresultCode,Intentdata)方法。為了知道該方法時(shí)由哪個(gè)
請(qǐng)求的結(jié)果所觸發(fā)的,可利用requestCode請(qǐng)求碼;為了知道返回的數(shù)據(jù)來自于哪個(gè)新的
Activity,可利用resultCode結(jié)果碼。
Activity的回調(diào)機(jī)制
當(dāng)開發(fā)者開發(fā)一個(gè)組件時(shí),如果開發(fā)者需要該組件能響應(yīng)特定的事件,可以選擇性實(shí)現(xiàn)
該組件的特定方法,當(dāng)用戶在該組件上激發(fā)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 金華浙江金華永康市象珠鎮(zhèn)人民政府工作人員招聘筆試歷年參考題庫附帶答案詳解
- 職業(yè)健康與員工職業(yè)發(fā)展路徑的醫(yī)學(xué)倫理實(shí)踐
- 資陽四川資陽市公安局招聘軌道交通資陽線公安管理警務(wù)輔助人員45人筆試歷年參考題庫附帶答案詳解
- 甘肅2025年甘肅省婦幼保健院(甘肅省中心醫(yī)院)緊缺骨干人才招聘筆試歷年參考題庫附帶答案詳解
- 清遠(yuǎn)2025年廣東清遠(yuǎn)市清城區(qū)農(nóng)業(yè)農(nóng)村局招聘船員筆試歷年參考題庫附帶答案詳解
- 職業(yè)人群頸椎病的預(yù)防與康復(fù)策略
- 新疆2025年新疆兵團(tuán)興新職業(yè)技術(shù)學(xué)院招聘41人筆試歷年參考題庫附帶答案詳解
- 徐州首都醫(yī)科大學(xué)附屬北京地壇醫(yī)院徐州醫(yī)院(徐州市第七人民醫(yī)院)招聘5人筆試歷年參考題庫附帶答案詳解
- 巴中2025年四川巴中南江縣招聘衛(wèi)生專業(yè)技術(shù)人員64人筆試歷年參考題庫附帶答案詳解
- 安慶2025年安徽安慶望江縣中醫(yī)醫(yī)院招聘勞務(wù)派遣護(hù)理人員16人筆試歷年參考題庫附帶答案詳解
- 2025年湖北省武漢市中考物理試卷(含答案)
- 林場(chǎng)實(shí)習(xí)個(gè)人總結(jié)
- 2024-2025學(xué)年北京市海淀區(qū)高一上學(xué)期期中考試數(shù)學(xué)試題(解析版)
- 2025至2030中國時(shí)空智能服務(wù)(LBS)行業(yè)發(fā)展動(dòng)態(tài)及發(fā)展趨勢(shì)研究報(bào)告
- 透析患者營養(yǎng)風(fēng)險(xiǎn)評(píng)估與干預(yù)
- DB41/T 1354-2016 人民防空工程標(biāo)識(shí)
- 山東省棗莊市薛城區(qū)2024-2025學(xué)年高二上學(xué)期期末數(shù)學(xué)試題
- 部編版道德與法治八年級(jí)上冊(cè)每課教學(xué)反思
- 園林苗木的種實(shí)生產(chǎn)
- 【網(wǎng)絡(luò)謠言的治理路徑探析(含問卷)14000字(論文)】
- 2024年新安全生產(chǎn)法培訓(xùn)課件
評(píng)論
0/150
提交評(píng)論