Android中的事件處理機制

Android提供瞭強大的事件處理機制,它包括兩套處理機制:

1.基於監聽的事件處理

2.基於回調的事件處理

對於Android基於監聽的事件處理,主要的做法是為Android界面組件綁定特定的事件監聽器。

對於Android基於回調的事件處理,主要的方法是重寫Android組件特定的回調方法或者重寫

Activity的回調方法

一、基於監聽的事件處理

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

1.Event Source(事件源):事件發生的場所,通常就是各個組件、例如按鈕、窗口、菜單等。

2.Event(事件):事件封裝瞭界面組件上發生的特定事情(通常就是一次用戶操作)。

3.Event Listener(事件監聽器):扶著監聽事件源所發生的事件,並對各種事件做出相應的響應。

    事件處理流程示意圖如下:

    內部類可以作為事件監聽器類,如果某個監聽器要被多個GUI界面所共享我們可以使用外部類

作為事件監聽器類,還有一種是匿名內部類作為事件監聽器類,這裡就不詳細介紹瞭。

    Android還中還有一種更簡單的綁定事件監聽器的方式,直接在界面佈局中為指定的標簽綁定事件處理方法。

如:android:onClick="clickHandler",這樣就意味著開發者需要在該界面佈局對應的Activity中定義一個void clickHandler(View source),該方法將會處理該按鈕上的單擊事件。

下面我們來看一段Java代碼:

[java] 

public class Ex003_01Activity extends Activity {  

    /** Called when the activity is first created. */  

    @Override  

    public void onCreate(Bundle savedInstanceState) {  

        super.onCreate(savedInstanceState);  

        setContentView(R.layout.main);  

          

        //定義一個事件的處理方法  

        //輕重source參數代表事件源  

        public void clickHandler(View source){  

            TextView show=(TextView)findViewById(R.id.tv);  

            show.setText("bn按鈕被點擊瞭");  

        }  

    }  

}  

 

二、基於回調事件處理

    從代碼的實現的角度來看,基於回調的事件處理模型更加簡單。如果說事件監聽制是一種委托式的事件處理,那麼回調機制恰好與之相反:對於基於回調機制的事件處理模型來說,事件源與事件監聽器是統一的。為瞭使用回調機制類處理GUI組件上所發生的事件,我們需要為該組件提供對應的事件處理方法–而Java又是一種靜態語言,我們無法為某個對象動態的添加方法,因此隻能繼承GUI組件類,並重寫該組件類的事件處理方法來實現。

為瞭實現回調機制的事件處理,Android為所有的GUI組件都提供瞭一些事件處理的回調方法,以View為例,該類包含如下方法:

boolean onKeyDown(int keyCode,KeyEvent event):當用戶在該組件上按下某個鍵時觸發的方法。

boolean onKeyLongPress(int keyCode,KeyEvent event):當用戶在該組件上長按某個按鈕時觸發該方法。

boolean onKeyShortcut(int keyCode,KeyEvent event): 當一個快捷鍵事件發生時觸發該放過。

boolean onKeyUp(int keyCode,KeyEvent event):當用戶在該組件上松開某個按鍵時觸發該方法

boolean onTouchEvent(MotionEvent event):當用戶在該組件上觸發觸摸屏事件時觸發該方法。

boolean onTrackballEventI(MotionEvent event):當用戶在該組件上觸發軌跡球屏事件時觸發該事件。

下面我們來看一段代碼:

[java] 

public class MyButton extends Button  

{  

    public MyButton(Context context , AttributeSet set)  

    {  

        super(context , set);  

        // TODO Auto-generated constructor stub  

    }  

    @Override  

    public boolean onKeyDown(int keyCode, KeyEvent event)  

    {  

        super.onKeyDown(keyCode , event);  

        Log.v("-crazyit.org-" , "the onKeyDown in MyButton");  

        //返回true,表明該事件不會向外擴散  

        return true;  

    }  

}  

 

上面的代碼我們重寫瞭Button類的onKeyDown(int keyCode,KeyEvent event)方法,該方法將會負責處理按鈕上的鍵盤事件。

基於回調的事件傳播

    幾乎所有的基於回調的事件處理方法都有一個boolean類型的返回值,該返回值用於標識該處理方法是否能完全處理該事件:

1.如果返回true,則表明該處理方法已完全處理瞭該事件,該事件不會被傳播出去。

2.如果返回false,表明該處理方法未完全處理該事件,該事件會傳播出去。

    對於基於回調的事件處理傳播而言,某組件上所發生的事情不僅激發該組件上的回調方法,也會觸發該組件所在的Activity的回調方法——隻要事件能傳播到該Activity。

You May Also Like