Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android應用開發入門(三)事件處理機制介紹

Android應用開發入門(三)事件處理機制介紹

編輯:Android開發實例

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

  •   基於監聽的事件處理。
  •   基於回調的事件處理。

 

一、基於監聽的事件處理

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

  •   Event Source(事件源):事件發生的場所,通常就是各個組件。
  •   Event(事件):事件封裝了界面組件換上發生的特定事情。
  •   Event Listener(事件監聽器):負責監聽事件源所發生的事件,並對各種時間做出相應的相應。

 

  Android的事件處理機制是一種委派式事件處理方式:普通組件(事件源)將整個事件處理委托給特定的對象(事件監聽器);當該事件源發生指定的事件時,就通知所委托的事件監聽器,由事件監聽器來處理這個事件。

 

  所謂事件監聽器,其實就是實現了特定接口的Java類的實力。在程序中實現事件監聽器,通常有如下幾種形式:

  •   內部類形式:將事件監聽器類定義成當前類的內部類。
  •   外部類形式:將事件監聽類定義成一個外部類。
  •   Activity本身作為事件監聽器類:讓Activity本身實現監聽器接口,並實現事件處理方法。
  •   匿名內部類形式:使用匿名內部類創建時間監聽器對象。

 

1、外部類形式

  使用頂級類定義事件監聽器類的形式比較少見,所以不推薦使用,主要因為如下兩個原因:

  •   事件監聽器通常屬於特定的GUI界面,定義成外部類不利於提高程序的內聚性。
  •   外部類形式的事件監聽器不能自由訪問創建GUI界面的類中的組件,編程不夠簡潔。

  使用步驟:

  1.   創建一個新類,實現需要監聽事件的監聽器接口。
  2.   在使用的時候,給某事件源的特定事件綁定此類。

示例:

事件處理類,監聽了OnLongClick事件。

  1. public class SendSmsListener implements OnLongClickListener {  
  2.       
  3.     private Activity act;  
  4.     public SendSmsListener(Activity act)  
  5.     {  
  6.         this.act=act;  
  7.     }  
  8.     public boolean onLongClick(View arg0) {  
  9.         // 事件處理邏輯  
  10.         return false;  
  11.     }  

調用:

  1. public class Main extends Activity {  
  2.     /** Called when the activity is first created. */ 
  3.     @Override 
  4.     public void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.         setContentView(R.layout.main);  
  7.         Button btn=(Button)this.findViewById(R.id.button1);  
  8.         btn.setOnLongClickListener(new SendSmsListener(this));         
  9.     }  
  10. }  

 

2、Activity本身作為事件監聽器類

  這種形式使用Activity本身作為監聽器類,可以直接在Activity類中定義事件處理方法,這種形式非常簡潔。但是這種形式可能造成程序結構混亂,因為Activity的主要職責是完成界面初始化工作。

示例 :

  1. public class Main extends Activity implements OnClickListener{  
  2.     /** Called when the activity is first created. */ 
  3.     @Override 
  4.     public void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.         setContentView(R.layout.main);  
  7.         Button btn=(Button)this.findViewById(R.id.button1);  
  8.         btn.setOnClickListener(this);//綁定Activity的OnClick事件  
  9.     }  
  10.  
  11.     public void onClick(View v) {  
  12.         // 事件處理邏輯          
  13.     }  
  14. }  

 

3、直接綁定到XML標簽中

  在Android中,可以直接把事件處理綁定到XML標簽中。

示例:

  1. <Button 
  2.     android:id="@+id/button1" 
  3.     android:layout_width="wrap_content" 
  4.     android:layout_height="wrap_content" 
  5.     android:text="Button"   
  6.     android:onClick="btnClick"/> 

處理事件:

  1. public class Main extends Activity{  
  2.     /** Called when the activity is first created. */ 
  3.     @Override 
  4.     public void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.         setContentView(R.layout.main);    
  7.     }  
  8.  
  9.     public void btnClick(View v) {  
  10.         // 事件處理邏輯          
  11.     }  
  12. }  

4、匿名內部類作為事件監聽器

  因為大部分時候,事件處理器都是沒有復用價值的,因此大部分事件監聽器只是臨時使用一次,所以使用匿名內部類形式的事件監聽器更合適。這也是最廣泛的用法。

示例:

  1. public class Main extends Activity{  
  2.     /** Called when the activity is first created. */ 
  3.     @Override 
  4.     public void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.         setContentView(R.layout.main);  
  7.         Button btn=(Button)this.findViewById(R.id.button1);  
  8.         btn.setOnClickListener(new OnClickListener() {              
  9.             public void onClick(View v) {  
  10.                 // 事件處理邏輯                  
  11.             }  
  12.         });         
  13.     }      
  14. }  

 

二、基於回調的事件處理

  對於基於回調的事件處理模型來說,事件源與事件監聽器是統一的,或者說事件監聽器完全消失了。當用戶在GUI組件上激發某個事件時,組件自己特定的方法將會負責處理該事件。此處理方法一般會有一個boolean類型的返回值,該返回值用於標識該處理方法是否能完全處理該事件。如果返回true,表明該處理方法已完全處理該事件,該事件不會傳播出去。如果返回false,表明該處理方法並未完全處理該事件,該事件會傳播出去。

  基於回調的事件處理方式主要用於重寫新的組件,繼承原組件的類,然後對其事件進行重寫。在布局的時候,直接使用重寫好的新組件。此時如果觸發事件,則由新組件執行處理。(此方式一般不常用)

示例:

  1. public class Mybutton extends Button {  
  2.     public Mybutton(Context context, AttributeSet attrs) {  
  3.         super(context, attrs);  
  4.     }      
  5.     @Override 
  6.     public boolean onKeyDown(int keyCode, KeyEvent event) {  
  7.         super.onKeyDown(keyCode, event);  
  8.         //事件處理邏輯  
  9.         return true;//表示該事件不會像外擴散  
  10.     }  

 

總結:對於基於監聽的事件處理模型來說,事件源和事件監聽器是分離的,當事件源上發生特定事件之後,該事件交給事件監聽器負責處理;對於基於回調的事件處理模型來說,事件源和事件監聽器是統一的,當事件源發生特定事件之後,該事件還是由事件源本身負責處理。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved