




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
與界面編程最緊密相關(guān)的知識就是事件處理了,當(dāng)用戶在程序界面上執(zhí)行各種操作時,應(yīng)用程序必須為用戶動作提供響應(yīng),這種響應(yīng)動作就需要通過事件處理來完成。在Android系統(tǒng)中提供了兩種事件處理的方式,分別是基于回調(diào)的事件處理和基于監(jiān)聽器的事件處理?;诒O(jiān)聽器的事件處理方式:先定義組件,然后為組件設(shè)定監(jiān)聽器?;诨卣{(diào)的事件處理方式:讓每一個組件繼承UI類,并重寫該類的事件處理方法。當(dāng)該組件遇到某事件時,即會觸發(fā)相應(yīng)的事件處理方法。Android事件處理Chapter
5對于基于監(jiān)聽的事件處理來說,主要處理方法是為Android界面組件綁定特定的事件監(jiān)聽器。相比于基于回調(diào)的事件處理,基于監(jiān)聽的事件處理方式更具“面向?qū)ο蟆毙再|(zhì)的。5.1.1監(jiān)聽處理模型中的三種對象事件封裝了界面組件上發(fā)生的特定事件的具體信息,如果監(jiān)聽器需要獲取界面組件上所發(fā)生事件的相關(guān)信息,一般通過事件Event對象來傳遞。產(chǎn)生事件的來源,通常是各種組件,如按鈕、窗口等。事件Event事件源EventSource事件監(jiān)聽器EventListener負(fù)責(zé)監(jiān)聽事件源發(fā)生的事件,并對不同的事件做相應(yīng)的處理。在Android系統(tǒng)基于監(jiān)聽的事件處理模型中,主要涉及如下所示的三類對象:5.1.1監(jiān)聽處理模型中的三種對象如圖所示,基于監(jiān)聽的事件處理的處理流程如下:(1)用戶按下屏幕中的一個按鈕或者單擊某個菜單項(xiàng)。(2)按下動作會激活一個相應(yīng)的事件,這個事件會觸發(fā)事件源上注冊的事件監(jiān)聽器。(3)事件監(jiān)聽器會調(diào)用對應(yīng)的事件處理器(事件監(jiān)聽器里的實(shí)例方法)來做出相應(yīng)的響應(yīng)。5.1.1監(jiān)聽處理模型中的三種對象由此可見,基于監(jiān)聽器的事件處理機(jī)制是一種委派式Delegation的事件處理方式,事件源將整個事件委托給事件監(jiān)聽器,由監(jiān)聽器對事件進(jìn)行響應(yīng)處理。這種處理方式將事件源和事件監(jiān)聽器分離,有利于提供程序的可維護(hù)性。每個組件都可以針對特定的事件指定一個事件監(jiān)聽器,每個事件監(jiān)聽器也可監(jiān)聽一個或多個事件源。因?yàn)樵谕粋€事件源上有可能會發(fā)生多種未知的事件,所以委派式Delegation的事件處理方式會把事件源上所有可能發(fā)生的事件分別授權(quán)給不同的事件監(jiān)聽器來處理。同時也可以讓某一類事件都使用同一個事件監(jiān)聽器進(jìn)行處理。5.1.2Android系統(tǒng)中的監(jiān)聽事件ListView事件監(jiān)聽setOnItemSelectedListener:鼠標(biāo)滾動時觸發(fā)。setOnItemClickListener:點(diǎn)擊時觸發(fā)。EditText事件監(jiān)聽setOnKeyListener:獲取焦點(diǎn)時觸發(fā)。RadioGroup事件監(jiān)聽setOnCheckedChangeListener:點(diǎn)擊時觸發(fā)。CheckBox事件監(jiān)聽setOnCheckedChangeListener:點(diǎn)擊時觸發(fā)。Spinner事件監(jiān)聽setOnItemSelectedListener:點(diǎn)擊時觸發(fā)。5.1.2Android系統(tǒng)中的監(jiān)聽事件DatePicker事件監(jiān)聽onDateChangedListener:日期改變時觸發(fā)。DatePickerDialog事件監(jiān)聽onDateSetListener:設(shè)置日期時觸發(fā)。TimePicker事件監(jiān)聽onTimeChangedListener:時間改變時觸發(fā)。TimePickerDialog事件監(jiān)聽onTimeSetListener:設(shè)置時間時觸發(fā)Button、ImageButton事件監(jiān)聽setOnClickListener:點(diǎn)擊時觸發(fā)5.1.2Android系統(tǒng)中的監(jiān)聽事件Menu事件監(jiān)聽onOptionsItemSelected:點(diǎn)擊時觸發(fā)Gallery事件監(jiān)聽setOnItemClickListener:點(diǎn)擊時觸發(fā)GridView事件監(jiān)聽setOnItemClickListener:點(diǎn)擊時觸發(fā)5.1.3實(shí)現(xiàn)事件監(jiān)聽器的方法內(nèi)部類形式AB外類類形式CActivity本身作為事件監(jiān)聽器類E直接綁定到標(biāo)簽D匿名內(nèi)部類形式在Android系統(tǒng)中,通過編程方式實(shí)現(xiàn)事件監(jiān)聽器的方法有如下幾種5.1.3實(shí)現(xiàn)事件監(jiān)聽器的方法將事件監(jiān)聽器類定義在當(dāng)前類的內(nèi)部,如下所示:publicclassButtonTestextendsActivity{protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);this.setContentView(R.layout.main);Buttonbutton=(Button)findViewById(R.id.button);MyButtonlistener=newMyButton();Button.setOnClickListener(listener);}classMyButtonimplementsOnclickListener{publicvoidonClick(Viewv){System.out.println("內(nèi)部類作為事件監(jiān)聽器");} } }通過上述代碼,將事件監(jiān)聽器類定義成當(dāng)前類的內(nèi)部類。通過使用內(nèi)部類,可以在當(dāng)前類中復(fù)用監(jiān)聽器類。另外,因?yàn)楸O(jiān)聽器類是外部類的內(nèi)部類,所以可以自由訪問外部類的所有界面組件。1.內(nèi)部類形式5.1.3實(shí)現(xiàn)事件監(jiān)聽器的方法將事件監(jiān)聽器類定義成外部類形式,如下所示:ButtonTest類publicclassButtonTestextendsActivity{protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);this.setContentView(R.layout.main);Buttonbutton=(Button)findViewById(R.id.button);MyButtonlistener=newMyButton();Button.setOnClickListener(newMyButtonListener("外部類作為事件監(jiān)聽器"));}MyButtonListener類classMyButtonListenerimplementsOnclickListener{privateStringstr;publicMyButtonListener(Stringstr){super();this.str=str; }publicvoidonClick(Viewv){System.out.println(str);} } }2.外部類形式5.1.3實(shí)現(xiàn)事件監(jiān)聽器的方法當(dāng)用戶單擊button按鈕時,將會觸發(fā)外部MyButtonListener類中的MyButtonListener監(jiān)聽器。使用外部類定義事件監(jiān)聽器的形式比較少見,主要因?yàn)槿缦聝蓚€原因:事件監(jiān)聽器通常屬于特定的GUI界面,定義成外部類不利于提高程序的內(nèi)聚性;外部類形式的事件監(jiān)聽器不能自由訪問創(chuàng)建GUI界面的類中的組件,編程不夠簡潔。但是如果某個事件監(jiān)聽器確實(shí)需要被多個GUI界面所共享,而且主要是完成某種業(yè)務(wù)邏輯的實(shí)現(xiàn),則可以考慮使用外部類的形式來定義事件監(jiān)聽器類。5.1.3實(shí)現(xiàn)事件監(jiān)聽器的方法將Activity本身作為事件監(jiān)聽器類,如下所示:publicclassButtonTestextendsActivity{protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);this.setContentView(R.layout.main);Buttonbutton=(Button)findViewById(R.id.button);Button.setOnClickListener(this);publicvoidonClick(Viewv){System.out.println("Activity本身作為事件監(jiān)聽器");}}Activity類實(shí)現(xiàn)了OnClickListener事件監(jiān)聽接口,從而可以在該Activity類中直接定義事件處理器方法onClick(viewv),當(dāng)為某個組件添加該事件監(jiān)聽器對象時,直接使用this作為事件監(jiān)聽器對象即可。3.外部類形式5.1.3實(shí)現(xiàn)事件監(jiān)聽器的方法可能造成程序結(jié)構(gòu)混亂。Activity的主要職責(zé)應(yīng)該是完成界面初始化,但此時還需包含事件處理器方法,從而引起混亂;A如果activity界面類需要實(shí)現(xiàn)監(jiān)聽器接口,讓人感覺比較怪異。B這種使用activity本身作為監(jiān)聽器類的形式,可以直接在activity類中定義事件處理器,非常簡潔。但有兩個缺點(diǎn):5.1.3實(shí)現(xiàn)事件監(jiān)聽器的方法在Android應(yīng)用程序中,因?yàn)榭杀粡?fù)用的代碼通常都被抽象成了業(yè)務(wù)邏輯方法,所以通常事件處理器都沒有什么利用價值,大部分事件監(jiān)聽器只是臨時使用一次,因此使用匿名內(nèi)部類形式的事件監(jiān)聽器更合適。其實(shí)這種形式也是目前使用最廣泛的事件監(jiān)聽器形式,如下所示:Buttonbutton=(Button)findViewById(R.id.button);button.setOnClickListener(newOnClickListener(){PublicvoidonClick(Viewv){System.out.println("匿名內(nèi)部類作為事件監(jiān)聽器");}})這種形式唯一的缺點(diǎn)就是匿名內(nèi)部類的語法有點(diǎn)不易掌握,如果讀者Java基礎(chǔ)扎實(shí),匿名內(nèi)部類的語法掌握較好,通常建議使用匿名內(nèi)部類作為監(jiān)聽器。4.使用匿名內(nèi)部類創(chuàng)建事件監(jiān)聽器對象5.1.3實(shí)現(xiàn)事件監(jiān)聽器的方法其實(shí)在Android系統(tǒng)中還有一種更簡單的綁定事件監(jiān)聽器的的方式:直接在界面布局文件中為指定標(biāo)簽綁定事件處理方法。Android系統(tǒng)中的很多標(biāo)簽都支持諸如onClick、onLongClick等屬性,這種屬性的屬性值是一個形如“xxx(Viewsource)”格式的方法。在布局文件中為button添加屬性,如下所示:<Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="button"android:id="@+id/button"android:onClick="clickHanlder"/>為Button按鈕綁定一個事件處理方法:clickHanlder,這意味著開發(fā)者需要在該界面布局對應(yīng)的Activity中定義一個voidclickHanler(Viewsource)方法,該方法將會負(fù)責(zé)處理該按鈕上的單擊事件。5.直接綁定到標(biāo)簽5.1.3實(shí)現(xiàn)事件監(jiān)聽器的方法下面是該界面布局對應(yīng)的java代碼:publicclassButtonTestextendsActivity{ protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); this.setContentView(R.layout.main);} publicvoidClickHandler(Viewsource){ System.out.println("直接綁定到標(biāo)簽");}}相比基于監(jiān)聽器的事件處理模型,基于回調(diào)的事件處理模型要簡單些,該模型中,事件源和事件監(jiān)聽器是合一的,也就是說沒有獨(dú)立的事件監(jiān)聽器存在。當(dāng)用戶在GUI組件上觸發(fā)某事件時,由該組件自身特定的函數(shù)負(fù)責(zé)處理該事件。通常通過重寫Override組件類的事件處理函數(shù)實(shí)現(xiàn)事件的處理。publicbooleanonKeyDown(intkeyCode,KeyEventevent)01該方法是接口KeyEvent.Callback中的抽象方法,所有的View全部實(shí)現(xiàn)了該接口并重寫了該方法,該方法用來捕捉手機(jī)鍵盤被按下的事件。下面列舉幾個Android中常用的回調(diào)方法:publicbooleanonKeyUp(intkeyCode,KeyEventevent)02該方法同樣是接口KeyEvent.Callback中的一個抽象方法,并且所有的View同樣全部實(shí)現(xiàn)了該接口并重寫了該方法,onKeyUp方法用來捕捉手機(jī)鍵盤按鍵抬起的事件。publicbooleanonTouchEvent(MotionEventevent)03該方法在View類中的定義,并且所有的View子類全部重寫了該方法,應(yīng)用程序可以通過該方法處理手機(jī)屏幕的觸摸事件。publicbooleanonTrackballEvent(MotionEventevent)04手機(jī)中軌跡球的處理方法,所有的View同樣全部實(shí)現(xiàn)了該方法。提示:以上方法的返回值為一個boolean類型的變量,當(dāng)返回true時,表示已經(jīng)完整地處理了這個事件,并不希望其他的回調(diào)方法再次進(jìn)行處理;而當(dāng)返回false時,表示并沒有完全處理完該事件,更希望其他回調(diào)方法繼續(xù)對其進(jìn)行處理,例如Activity中的回調(diào)方法。protectedvoidonFocusChanged(booleangainFocus,intdirection,RectpreviouslyFocusedRect)05該方法是焦點(diǎn)改變的回調(diào)方法,當(dāng)某個控件重寫了該方法后,當(dāng)焦點(diǎn)發(fā)生變化時,會自動調(diào)用該方法來處理焦點(diǎn)改變的事件。onFocusChanged只能在View中重寫。5.3.1實(shí)例目標(biāo)在開發(fā)Android應(yīng)用程序時,有時候可能需要讓應(yīng)用程序隨著系統(tǒng)的整體設(shè)置進(jìn)行調(diào)整,例如判斷當(dāng)前設(shè)備的屏幕方向。另外,有時還需要讓應(yīng)用程序能夠隨時監(jiān)聽系統(tǒng)設(shè)置的變化,以便對系統(tǒng)的修改動作進(jìn)行響應(yīng)。接下來的實(shí)例,當(dāng)單擊屏幕按鈕時,屏幕方向?qū)⑦M(jìn)行更改,接著又通過重寫onConfigurationChanged方式響應(yīng)屏幕更改,彈出相應(yīng)提示,同時演示了基于監(jiān)聽和基于回調(diào)方式的處理方法。5.3.2具體實(shí)現(xiàn)android:layout_width="fill_parent”android:layout_height="fill_parent"><Button android:id="@+id/bn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="更改屏幕方向"/></LinearLayout>(1)編寫布局文件main.xml,在該界面中僅包含一個普通按鈕,具體實(shí)現(xiàn)代碼如下:<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android" android:orientation="vertical"本實(shí)例的具體實(shí)現(xiàn)流程如下:5.3.2具體實(shí)現(xiàn)下面編寫Java程序文件ChangeCfg.java,調(diào)用Activity的setRequestedOrientation(int)方法來動態(tài)更改屏幕方向,并且重寫Activity的onConfigurationChanged(ConfigurationnewConfig)方法。具體實(shí)現(xiàn)代碼如下:publicclassChangeCfgextendsActivity{ @OverridepublicvoidonCreate(BundlesavedInstanceState) {(2)在Android應(yīng)用程序中,為了動態(tài)地更改系統(tǒng)設(shè)置,可調(diào)用Activity的setRequestedOrientation(int)方法來修改屏幕方向。如果在Android應(yīng)用程序中需要監(jiān)聽系統(tǒng)設(shè)置的更改狀況,可以通過重寫Activity中的onConfigurationChanged(ConfigurationnewConfig)方法實(shí)現(xiàn),此方法是一個基于回調(diào)的事件處理方法。當(dāng)系統(tǒng)設(shè)置信息發(fā)生改變時,onConfigurationChanged方法會被自動觸發(fā)。5.3.2具體實(shí)現(xiàn)//如果當(dāng)前是橫屏 if(config.orientation==Configuration.ORIENTATION_LANDSCAPE){ //設(shè)為豎屏 ChangeCfg.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); }//如果當(dāng)前是豎屏if(config.orientation==Configuration.ORIENTATION_PORTRAIT){super.onCreate(savedInstanceState); setContentView(R.layout.main); Buttonbn=(Button)findViewById(R.id.bn);//為按鈕綁定事件監(jiān)聽器 bn.setOnClickListener(newOnClickListener(){ @Override publicvoidonClick(Viewsource){ Configurationconfig=getResources().getConfiguration();5.3.2具體實(shí)現(xiàn){ super.onConfigurationChanged(newConfig); Stringscreen=newConfig.orientation== Configuration.ORIENTATION_LANDSCAPE?"橫向屏幕":"豎向屏幕"; Toast.makeText(this,"系統(tǒng)的屏幕方向發(fā)生改變"+"\n修改后的屏幕方向?yàn)椋? +screen,Toast.LENGTH_LONG).show(); }}//設(shè)為橫屏 ChangeCfg.this.setRequestedOrientation( ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); } } }); }
//重寫該方法,用于監(jiān)聽系統(tǒng)設(shè)置的更改,主要是監(jiān)控屏幕方向的更改 @Override publicvoidonConfigurationChanged(ConfigurationnewConfig)5.3.2具體實(shí)現(xiàn)在文件AndroidManifest.xml中設(shè)置該Activity可以監(jiān)聽屏幕方向改變的事件,這樣當(dāng)程序改變手機(jī)屏幕方向時,Activity的onConfigurationChanged()方法就會被回調(diào)。具體實(shí)現(xiàn)代碼如下: <application android:icon="@drawable/ic_launcher" android:label="@string/app_name">(3)另外,為了讓該Activity能監(jiān)聽屏幕方向更改的事件,需要在配置該Activity時指定android:configChanges屬性。android:configChanges屬性支持的屬性值有mcc、mnc、locale、touchscreen、keyboard、keyboardHidden、navigation、orientation、screenLayout、uiMode、screenSize、smallestScreenSize、fontScale。其中orientation屬性值用于指定該Activity可以監(jiān)聽屏幕方向改變的事件。5.3.2具體實(shí)現(xiàn)在文件AndroidManifest.xml中設(shè)置該Activity可以監(jiān)聽屏幕方向改變的事件,這樣當(dāng)程序改變手機(jī)屏幕方向時,Activity的onConfigurationChanged()方法就會被回調(diào)。具體實(shí)現(xiàn)代碼如下: <application android:icon="@drawable/ic_launcher" android:label="@string/app_name">(3)另外,為了讓該Activity能監(jiān)聽屏幕方向更改的事件,需要在配置該Activity時指定android:configChanges屬性。android:configChanges屬性支持的屬性值有mcc、mnc、locale、touchscreen、keyboard、keyboardHidden、navigation、orientation、screenLayout、uiMode、screenSize、smallestScreenSize、fontScale。其中orientation屬性值用于指定該Activity可以監(jiān)聽屏幕方向改變的事件。5.3.2具體實(shí)現(xiàn)<!--設(shè)置Activity可以監(jiān)聽屏幕方向改變的事件--> <activity android:configChanges="orientation" android:name="org.cfg.ChangeCfg" android:label="@string/app_name"> <intent-filter><actionandroid:name="ent.action.MAIN"/> <categoryandroid:name="ent.category.LAUNCHER"/> </intent-filter> </activity> </application>在模擬器中單擊按鈕后將變?yōu)闄M向屏幕,執(zhí)行效果如圖所示。5.3.2具體實(shí)現(xiàn)5.3.3相關(guān)知識點(diǎn)在Androi
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- DB31/T 1240.1-2020公共數(shù)據(jù)共享交換工作規(guī)范第1部分:平臺建設(shè)和運(yùn)行管理要求
- DB31/T 1146.2-2019智能電網(wǎng)儲能系統(tǒng)性能測試技術(shù)規(guī)范第2部分:風(fēng)電出力平滑應(yīng)用
- DB31 581-2012礦渣粉單位產(chǎn)品能源消耗限額
- 橡膠制品行業(yè)的品牌形象與企業(yè)文化考核試卷
- 美容儀器在皮膚治療技術(shù)的研究動態(tài)與市場應(yīng)用考核試卷
- 2024年皮手套及皮革制衣著附件資金申請報告代可行性研究報告
- 昆明市西山區(qū)2025年八年級《語文》上學(xué)期期末試題與參考答案
- 2024年吡嗪酮項(xiàng)目投資申請報告代可行性研究報告
- 2025年中國筆記本內(nèi)存行業(yè)市場現(xiàn)狀及未來發(fā)展前景預(yù)測分析報告
- 2024版中國血脂管理指南
- 高考志愿填報師資格新版考試題及答案
- 人教版(PEP)2024年小升初英語試卷(含答案)
- DB36-T 1983-2024 安寧療護(hù)服務(wù)規(guī)范
- 2024-2025學(xué)年全國中學(xué)生天文知識競賽考試題庫(含答案)
- 心衰健康宣教課件
- 馬工程《公共財政概論》課后習(xí)題庫(含)參考答案(可做期末復(fù)習(xí)和試卷)
- DB36T 1968-2024 公路路基工程利用鋰渣技術(shù)規(guī)范(試行)
- 醫(yī)療機(jī)構(gòu)工作人員廉潔從業(yè)九項(xiàng)準(zhǔn)則自查自糾報告
- (正式版)JC∕T 60021-2024 石膏基自流平砂漿應(yīng)用技術(shù)規(guī)程
- 日雜店購銷合同清單
評論
0/150
提交評論