Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android筆記Android基於事件監聽器處理機制

Android筆記Android基於事件監聽器處理機制

編輯:關於Android編程

 
一、Android的事件處理 Android事件處理包括兩個部分:Android事件處理機制(基本)和Android消息傳遞機制(進階)。前者包含三種處理方式,即基於監聽的事件處理、基於回調的事件處理、直接綁定到標簽;後者包含兩種處理方式,即Handler消息傳遞、異步任務處理。 \
1.Android的事件處理機制 (1)基於監聽的事件處理方式 通常做法是為Android界面組件綁定特定的事件監聽器,在事件監聽器的方法裡編寫事件處理代碼。 (2)基於回調的事件處理方式 通常做法是重寫Android組件的特定的回調方法,Android為絕大部分界面組件都提供了事件相應的回調方法,我們只需重寫它們即可。當我們觸發相應組件時,由系統根據具體情景自動調用組件的方法。 (3)直接綁定到標簽 即我們在界面布局文件中為指定組件標簽設置事件屬性,屬性值是一個方法的方法名,然後再在Activity中定義該方法,編寫具體的事件處理代碼,當我們觸發綁定android:OnClick標簽的組件時,作出相應的響應。 2.Android消息傳遞機制 (1)Handler消息傳遞 (2)異步任務處理。 二、基於監聽的事件處理 1.事件處理模型 基於監聽的事件處理模型,主要涉及三類對象: (1)EventSource(事件源) 產生事件的組件,即事件發生的場所,如按鈕、菜單等; (2)Event(事件) 具體某一操作的詳細描述,事件封裝了操作的相關信息,如果想獲得事件源上所發生事件的相關信息,可通過Event對象來取得,例如按鍵事件按下的是哪個鍵、觸摸事件發生的位置等; (3)EventListener(事件監聽器) 負責監聽用戶在事件源上的操作(如單擊),並對用戶的各種操作做出相應的相應,事件監聽器中可包含多個事件處理器,一個事件處理器實際上就是一個事件處理方法。 \ 說明:實際上,基於監聽的事件處理是一種委托式事件處理。普通組件(事件源)將整個事件處理委托給特定的對象(事件監聽器),當該事件源發生指定的事情時,系統自動生成事件對象,並通知所委托的事件監聽器,由事件監聽器相應的事件處理器來處理這個事件。 2.基於監聽的事件處理開發步驟 (1)獲取普通界面控件(事件源),即被監聽的對象; (2)實現事件監聽器類,該監聽器類是一個特殊的Java類,必須實現一個XxxListener接口。需要注意的是,實現事件監聽器主要有四種形式: >內部類形式:將事件監聽器類定義為當前類的內部類; >外部類形式:將事件監聽器類定義成一個外部類; >類自身作為事件監聽器類:讓Activity本身實現監聽器接口,並實現事件處理方法; >匿名內部類:使用匿名內部類創建事件監聽器對象; (3)調用事件源的setXxxListener方法將事件監聽器對象將事件監聽器對象作為傳入參數注冊給普通組件(事件源)。 三、簡易文本編輯器實例 通過該例,我們將學習如何使用內部類形式等四種方式來實現事件監聽器。 \ 1.源碼 (1)EventTest1.java:主Activity代碼
package com.example.androidevent;
import android.app.Activity;
import android.graphics.Color;
import android.graphics.Typeface;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class EventTest1 extends Activity implements OnClickListener
{
 private TextView content;
 int flag=0;	//字體樣式標識
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        content = (TextView)findViewById(R.id.content);
        //1.顏色:內部類形式
       Button redBtn = (Button)findViewById(R.id.red);
       Button greenBtn = (Button)findViewById(R.id.green);
       Button  blueBtn = (Button)findViewById(R.id.blue);
        EventListener inner = new EventListener();	 //實例化一個事件監聽器對象
        redBtn.setOnClickListener(inner);	 //向以下界面組件注冊同一個事件監聽器
        greenBtn.setOnClickListener(inner);
        blueBtn.setOnClickListener(inner);
        //2.字體大小:外部類形式
        Button bigger = (Button)findViewById(R.id.big);
        Button smaller = (Button)findViewById(R.id.small);
        OuterListener outer = new OuterListener(content);//實例化一個事件監聽器對象
        bigger.setOnClickListener(outer); 
        smaller.setOnClickListener(outer);
        //3.字體樣式:類自身作為事件監聽器
       Button boldBtn = (Button)findViewById(R.id.bold);
       Button inclineBtn = (Button)findViewById(R.id.incline);
       Button normalBtn = (Button)findViewById(R.id.normal);
       boldBtn.setOnClickListener(this);	 //向以下界面組件注冊同一個事件監聽器
       inclineBtn.setOnClickListener(this);
       normalBtn.setOnClickListener(this);
       //4.匿名內部類
       final EditText text = (EditText)findViewById(R.id.text);
       text.setOnClickListener(new OnClickListener(){
  public void onClick(View v)
  {
   String contentText=text.getText().toString();
   content.setText(contentText);	 //將編輯框內容設置到文本顯示框中
  }   
       });
    }

    /*方法一:內部類形式
     * 在onClick函數中,通過視圖的getId()方法判定產生事件組件的ID並作出相應的響應*/
    public class EventListener implements OnClickListener
    {
  public void onClick(View arg0) {
   switch(arg0.getId())
   {
    case R.id.red:	 //設置紅色按鈕被按下
     content.setTextColor(Color.RED);
     break;
    case R.id.green:
     content.setTextColor(Color.GREEN);
     break;
    case R.id.blue:
     content.setTextColor(Color.BLUE);
     break;
    default:
     break;
   }
  } 
    }
    /*方法3.類自身作為事件監聽器*/
 @Override
 public void onClick(View v) 
 {
  //flag為樣式標識,當flag=0表示默認,flag=1表示傾斜,flag=2表示加粗,flag=3表示傾斜又加粗
  switch(v.getId())
  {
   case R.id.bold:	 //設置加粗  
    if(flag==1||flag==3)
    {
     content.setTypeface(Typeface.MONOSPACE,Typeface.BOLD_ITALIC);    //設置系統默認的字體樣式
     flag=3;
    }
    else
    {
     content.setTypeface(Typeface.MONOSPACE,Typeface.BOLD);
     flag=2;
    }
    break;
   case R.id.incline:
    if(flag==2 || flag==3)
    {
     content.setTypeface(Typeface.MONOSPACE,Typeface.BOLD_ITALIC);   //設置系統默認的字體樣式
     flag=3;
    }else
    {
     content.setTypeface(Typeface.MONOSPACE,Typeface.ITALIC);
     flag=1;
    }
    break;
   case R.id.normal:
    content.setTypeface(Typeface.MONOSPACE,Typeface.NORMAL);   //設置系統默認的字體樣式
    flag=0;
    break;
   default:
    break;
  }
 }
}
(2)OuterListener.java:外部類形式事件監聽器
package com.example.androidevent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
/*外部類形式*/
public class OuterListener implements OnClickListener
{
 private TextView text;
 private float size;
 //構造方法1:將文本組件對象作為參數傳遞並賦值給類成員對象
 public OuterListener(TextView t)
 {
  this.text = t;
 }
 //構造方法2
 public OuterListener()
 {
  super();
 }
 
 public void onClick(View v)
 {
  size=  text.getTextSize();	//獲取文本字體大小
  switch(v.getId())
  {
   case R.id.big :
   {
    size+=4;
    break;
   }
   case R.id.small :
   {
      size-=4;
    break;
   }
   default:
    break;
  }
  //設置最值限度
  if(size<=8)
   size=8;
  if(size>=72)
   size=72;
  text.setTextSize(size);
 }
}


(2)效果演示 \
\ (3)源碼分析 a.內部類形式:即將事件監聽器類定義為當前類的內部類。 >優勢:一是使用內部類可以在當前類中復用該監聽器類,即多個事件源可以注冊同一個監聽器; 二是使用內部類可以自由訪問外部類的所有界面控件,內部類實質上是外部類的成員。 >適用范圍:內部類形式比較適合於多個事件源同時注冊同一事件監聽器的情形。 b.外部類形式:將事件監聽器類定義成一個外部類; >缺點:一是由於事件監聽器通常屬於特定的GUI,定義成外部類不利於提高程序的內聚性(如例子中需要通過外部類的構造方法傳遞一個文本對象並將其賦值給當前類的文本對象成員才能對其進行操作);二是外部類形式的事件監聽器不能自由訪問創建GUI界面中的組件且編程不夠簡潔。 >使用范圍:如果某個事件監聽器確實需要被多個GUI界面所共享,而且主要是完成某種業務邏輯的實現,則可以考慮使用外部類的形式來定義事件監聽器類。 c.類自身作為事件監聽器類:讓Activity本身實現監聽器接口,並實現事件處理方法; >優點:Activity類本身作為事件監聽器,就如同生活中,我們自己剛好能夠處理某一件事,不需要委托給他人處理,可以直接在Activity類中定義事件處理器方法,這種形式非常簡潔。 >缺點:可能造成程序結構混亂,Activity的主要職責應該是完成界面初始化工作,但此時還需包含事件處理器方法,從而引起混亂; 如果Activity界面類需要實現監聽器接口,給人感覺比較怪異。 d.匿名內部類:使用匿名內部類創建事件監聽器對象 >優點:事件處理器都沒有什麼復用價值(可復用代碼通常都被抽象成了業務邏輯方法),因此大部分事件監聽器只是臨時使用一次,所以使用匿名內部類形式的事件監聽器更合適。實際上,這種形式也是目前使用最廣泛的事件監聽器形式。注意:是匿名內部類中訪問局部成員變量時,該成員變量必須是final修飾的,而對於成員變量則沒有這個要求。 四、常見事件監聽器接口及其處理方法 以上四種形式都需要通過事件監聽類的OnClick成員處理方法,根據界面組件的Id來提供事件響應。此外,除匿名內部類形式,其余三種都需要類繼承相應的事件監聽器接口。 1.常見事件監聽器接口及處理方法

事件

接口

處理方法

描述

單擊事件

View.OnClickListener

abstract void onClick (View v)

單擊組件時觸發

單擊事件

View.OnLongClickListener

abstract boolean onLongClick (View v)

長按組件時觸發

鍵盤事件

View.OnKeyListener

abstract boolean onKey(View v, int keyCode, KeyEvent event)

處理鍵盤事件

焦點事件

View.OnFocusChangeListener

abstract void onFocusChange (View v, boolean hasFocus)

當焦點發生改變時觸發

觸摸事件

View.OnTouchListener

abstract boolean onTouch (View v, MotionEvent event)

產生觸摸事件

2.View類常見事件監聽器注冊方法

方法

描述

void setOnClickListener(View.OnClickListener l)

注冊單擊事件

void setOnLongClickListener(View.OnLongClickListener l)

注冊長按事件

void setOnKeyListener(View.OnKeyListener l)

注冊鍵盤事件

void setOnFocusChangeListener(View.OnFocusChangeListener l)

注冊焦點改變事件

void setOnTouchListener(View.OnTouchListener l)

注冊觸摸事件

void setOnCreateContextMenuListener(View.OnCreateContextMenuListener l)

注冊上下文菜單事件


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