所有的基于UI的應(yīng)用程序,事件都變得不可或缺!試想一下,如果我們做的程序單擊按鈕和其它控件都沒(méi)有反應(yīng),那么就如同一個(gè)人在這個(gè)世界上聽(tīng)不到聲音一樣!
Android為我們提供了兩種方式的事件處理:(1)基于監(jiān)聽(tīng)器的事件處理;(2)基于回調(diào)的事件處理。
對(duì)于基于監(jiān)聽(tīng)器的事件處理而言,主要就是為Android界面組件綁定特定的事件監(jiān)聽(tīng)器;對(duì)于基于回調(diào)的事件處理而言,主要做法是重寫(xiě)Android組件特定的回調(diào)函數(shù),Android大部分界面組件都提供了事件響應(yīng)的回調(diào)函數(shù),我們只要重寫(xiě)它們就行。
本章我們著重講一下基于監(jiān)聽(tīng)器的事件處理,基于回調(diào)的事件處理放在下一章講解。
相比于基于回調(diào)的事件處理,這是更具“面向?qū)ο?amp;rdquo;性質(zhì)的事件處理方式。在監(jiān)聽(tīng)器模型中,主要涉及三類(lèi)對(duì)象:
(1)事件源Event Source:產(chǎn)生事件的來(lái)源,通常是各種組件,如按鈕,窗口等。
(2)事件Event:事件封裝了界面組件上發(fā)生的特定事件的具體信息,如果監(jiān)聽(tīng)器需要獲取界面組件上所發(fā)生事件的相關(guān)信息,一般通過(guò)事件Event對(duì)象來(lái)傳遞。
(3)事件監(jiān)聽(tīng)器Event Listener:負(fù)責(zé)監(jiān)聽(tīng)事件源發(fā)生的事件,并對(duì)不同的事件做相應(yīng)的處理。
一、第一種:內(nèi)部類(lèi)作為監(jiān)聽(tīng)器
將事件監(jiān)聽(tīng)器類(lèi)定義成當(dāng)前類(lèi)的內(nèi)部類(lèi)。
a)使用內(nèi)部類(lèi)可以在當(dāng)前類(lèi)中復(fù)用監(jiān)聽(tīng)器類(lèi),因?yàn)楸O(jiān)聽(tīng)器類(lèi)是外部類(lèi)的內(nèi)部類(lèi)。
b)可以自由訪問(wèn)外部類(lèi)的所有界面組件,這也是內(nèi)部類(lèi)的兩個(gè)優(yōu)勢(shì)。
我們前面的例子全部采用的該種方式!
1、activity_main.xml界面文件
2、MainActivity.java程序文件
上面的理論也許聽(tīng)起來(lái)讓你頭大,尤其java這一套事件監(jiān)聽(tīng)模型,讓很多盡管可能是其它語(yǔ)言編程高手也感覺(jué)甚不適應(yīng),但如果分析上面代碼,則發(fā)現(xiàn)實(shí)際也是非常簡(jiǎn)單的。
我們這個(gè)案例中:?jiǎn)螕舭粹o,顯示用戶(hù)名和密碼!
事件:?jiǎn)螕羰录?br/> (1)注冊(cè)監(jiān)聽(tīng)事件:btnLogin.setOnClickListener(new LoginOnClickListener());
(2)事件監(jiān)聽(tīng)器:private class LoginOnClickListener implements OnClickListener
定義LoginOnClickListener類(lèi),從OnClickListener接口實(shí)現(xiàn)。
就這么簡(jiǎn)單!
二、第二種:匿名內(nèi)部類(lèi)作為事件監(jiān)聽(tīng)器類(lèi)
如果事件監(jiān)聽(tīng)器只是臨時(shí)使用一次,建議使用匿名內(nèi)部類(lèi)形式的事件監(jiān)聽(tīng)器更合適。
我們?nèi)匀灰陨鲜隼訛槔右愿脑欤瑢W(xué)習(xí)一下如何使用“匿名內(nèi)部類(lèi)作為事件監(jiān)聽(tīng)器類(lèi)”。
1、界面部分不變!
activity_main.xml界面文件
2、源程序加以改造!
MainActivity.java程序文件
三、對(duì)比
我們對(duì)比一下這兩種寫(xiě)法:
1、第①種
(1)注冊(cè):btnLogin.setOnClickListener(new LoginOnClickListener());
(2)內(nèi)部類(lèi):
2、第②種
實(shí)際上是把①種合二為一了,使用匿名內(nèi)部類(lèi)直接完成了。