Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android事件處理模型

Android事件處理模型

編輯:關於Android編程

事件處理是Android編程中非常重要的一個部分,因為Android應用在運行過程中會產生許多各種各樣的事件(動作),應用必須為這些動作執行對應的響應代碼;將產生的動作和響應聯系起來的方式就是事件處理機制。Android平台提供了兩種事件處理機制,分別是基於監聽的模式和基於回調的模式。

1. 基於監聽的事件處理模型

1.1 組成部分

事件源:事件發生的地方,比如某個按鈕、文本框等 事件:事件類型,通過Event對象表達 事件監聽器:負責監聽某種的事件類型,並執行相應的操作

基於監聽的事件處理模型首先需要創建一個事件監聽器,該事件監聽器可以監聽某一類型的事件;然後,把事件監聽器注冊到某個組件中;當該組件上發生了可以被該監聽器監聽的動作後,組件會產生一個代表該動作的Event對象,並把Event對象傳遞給監聽器。在Android中,生成Event對象以及Event對象的傳遞不需要程序員介入,系統會自動去處理這一步操作。程序員需要做的就是指定事件源,並在該事件源上注冊對應於某個事件類型的事件監聽器,並重寫相應的處理代碼。

xml布局代碼


        

Java代碼

public class MainActivity extends Activity {
    private Button mClickBtn;
    // 創建監聽器,監聽“點擊”事件
    final View.OnClickListener listener =
            new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    L.d("You click btn_click!");
                }
            };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mClickBtn = (Button) findViewById(R.id.btn_click);

    // 為mClickBtn組件設置事件類型為‘點擊’的監聽器
    mClickBtn.setOnClickListener(listener);
}

}

上述代碼在MainActivity中創建了一個監聽器listener,該監聽器負責監聽“點擊”事件,然後在onCreate方法中通過setOnClickListener方法將該監聽器注冊到mClickBtn上。

在上述代碼中,監聽器通過匿名內部類實現,並創建了一個該匿名內部類的對象,然後將該對象注冊到事件源上,這種方式與直接在設置監聽器的位置新建監聽器(如下所示)相比,好處在於該監聽器對象可以重用。

mClickBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        L.d("You click btn_click!");
    }
});

注意

一般監聽器都通過內部類實現,因為內部類可以訪問到外部類中包含的組件或字段,而一般監聽器都會涉及到對外部類中相關組件或字段的操作。如果通過外部類實現,還需要傳遞本類的引用,而且代碼也不是很直觀。 一般在監聽器中不實現業務邏輯,如果監聽器確實需要處理邏輯,可以把邏輯封裝在外部類的方法中,然後在監聽器中調用該方法(監聽器只負責簡單的數據展示或數據傳遞,邏輯處理通過專門的方法實現,這種編碼方式更符合面向對象的設計原則)

2. 基於回調的事件處理模型

上面所說的基於監聽的處理方式是一種委托的事件處理方式,即將事件處理委托給專門負責處理事件的監聽器;而接下來要討論的基於回調的處理方式則是一種主動式的事件處理方式,即事件由事件源本身處理。從代碼實現上來說,要添加事件處理的組件需要實現特定的接口,並重寫接口中的某些方法;當對應的事件發生時,系統會回調該組件中被重寫的方法。舉個例子

XML布局代碼


    

Java代碼

// 自定義MyButton類
public class MyButton extends Button {

    public MyButton(Context context, AttributeSet set) {
    super(context, set);
    }

// 設置回調函數
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        super.onKeyDown(keyCode, event);
        Log.i("MyButton", "MyButton onKeyDown");
        return false;
    }
}

public class MainActivity extends Activity {

    private Button mClickBtn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mClickBtn = (Button) findViewById(R.id.btn_click);

    // 設置監聽器
        mClickBtn.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                Log.i("mClickBtn", "onKeyListener");
                return false;
            }
        });
    }

// 設置Activity回調函數
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        super.onKeyDown(keyCode, event);
        Log.i("MainActivity", "MainActivity onKeyDown");
        return false;
    }
}

運行上述代碼後,在logcat中會打印:
onKeyListener
MyButton onKeyDown
MainActivity onKeyDown

也就是說,事件發生後被調用的先後順序是:監聽器 –> 組件的回調函數;當組件回調函數返回的值為false時,事件會繼續向上傳播,所以會繼續調用Acitivity中的回調函數;如果監聽器中的onKey方法返回true,則不會調用組件的回調函數。

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