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