天天看點

android(基于監聽)的事件處理

     基于監聽的事件模型分工更明确,事件源、事件監聽由兩個類分開,是以具有更好的可維護性。

    android的事件處理機制保證基于監聽的事件監聽器會被優先出發。

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

    1.event source(事件源):事件發生的場所,通常就是各個元件,例如按鈕,視窗,菜單等。

    2.event(事件):事件封裝了界面元件上發生的特定事情(通常就是一次使用者操作)。如果程式需要獲得界面元件上所發生事情的相關資訊,一般通過event對象來取得。

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

android(基于監聽)的事件處理

    android為不同的界面元件提供了不同的監聽器接口:

    1.view.onclicklistener:單擊事件的事件監聽器必須實作的接口。

    2.view.oncreatecontextmenulistener:建立上下文菜單事件的事件監聽器必須實作的接口。

    3.view.onfocuschangelistener:焦點改變事件的事件監聽器必須實作的接口。

    4.view.onkeylistener:按鍵事件的事件監聽器必須實作的接口。

    5.view.onlongclicklistener:長按事件的事件監聽器必須實作的接口。

    6.view.ontouchlistener:觸摸事件的事件監聽器必須實作的接口。

    所謂的事件監聽器,其實就是實作了特定接口的java類的執行個體。在程式中實作事件監聽器,通常有如下幾種形式。

    1.内部類形式:将事件監聽器類定義成目前的内部類。

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

    3.activity本身作為事件監聽器類:讓activity本身實作監聽器接口,并實作事件處理方法。

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

    5.直接綁定标簽:為ui元件的android:onclick屬性指定事件的監聽方法,開發者需要在activity中定義該事件監聽方法(該方法必須有一個view類型的形參,該形參代表被單擊的ui元件),當使用者單擊該ui元件時,系統将會激發android:onclick屬性所指定的方法。

    1.内部類作為事件監聽器類

    使用内部類作為事件監聽器類的優勢:

    ①使用内部類可以在目前類中複用該監聽器類

    ②因為監聽器類是外部類的内部類,是以可以自由通路外部類的所有界面元件。

示例:

activity_main.xml   

mainactivity.java

    2.外部類作為事件監聽器類

    外部類作為事件監聽器類的劣勢:

    ①事件監聽器通常屬于特定的gui界面,定義成外部類不利于提高程式的内聚性。

    ②外部類形式的事件監聽器不能自由通路gui界面的類中的元件,變成不夠簡潔。

    外部類作為事件監聽器類的優勢:

    如果某個事件監聽器确實需要被多個gui界面所共享,而且主要是完成某種業務邏輯的實作,則可以考慮使用外部類的形式來定義事件監聽器類。

activity_main.xml 

sendsmslistener.java

在androidmanifest.xml上添加發送短信的權限

 3.activity本身作為事件監聽器 

    activity本身作為事件監聽器的劣勢:

    ①這種形式可能造成程式結構混亂,activity的主要職責應該是完成界面初始化工作,但此時還需要包含事件處理器的方法,進而引起混亂。

    ②如果activity界面類需要實作監聽器接口,讓人感覺比較怪異。

     activity本身作為事件監聽器的優勢:

    直接在activity類中定義事件處理方法,非常簡潔。

    4.匿名内部類作為事件監聽器類   

    匿名内部類作為事件監聽器類的優勢:

    大部分時候,事件處理器都沒有什麼複用價值(可複用代碼通常都被抽象成了業務邏輯方法),是以大部分事件監聽器隻是臨時使用一次,是以使用匿名内部類形式的事件監聽器更合适。 

    匿名内部類作為事件監聽器類的劣勢:

    文法不宜掌握。

activity_main.xml

    5.直接綁定到标簽 

    對于很多android界面元件标簽而言,它們都支援onclick屬性,該屬性值就是一個形如xxx(view source)的方法的方法名。