Hello World 進階了 -- 事件處理 Part 2-1
This document is provided as is. You are welcomed to use it for
non-commercial purpose.
Written by: 國立中興大學資管系呂瑞麟 Eric Jui-Lin Lu
請勿轉貼
在本文中,我們將介紹 Android 的第二種事件處理機制,雖然這種方法比較複雜(尤其是對 Java 的事件處理機制不清楚,甚至物件導向概念不清楚的人),但是因為第一種事件處理機制並沒有辦法解決所有的事件處理,所以我們必須說明一下;細節的部分還是請讀者參考我們亞洲大學陳宜惠老師合寫的 "Java 101: 物件導向程式設計"的書。
本文中,我們先簡單的介紹事件處理的機制:由於 Java 的事件處理機制採用的是委任式事件處理模式,所以當某一 GUI 元件需要在事件發生時(以同一個範例來說,就是使用者在"按鈕"上點擊,而點擊即代表一個事件,按鈕即 GUI 元件),該 GUI 元件需要像系統註冊,註冊時同時告知系統事件發生時,必須來處理該事件的物件,而符合該物件的某一特定方法就是所謂的事件處理器;註冊後,一旦該事件發生,系統就會呼叫處理事件物件內的特定方法。
昏了嗎?如果你之前沒有開發過 Java 的 GUI 程式,其實這很正常。以下我們依據剛剛說過的步驟,以範例說明:
- 首先在程式中,我們必須先找出按鈕物件,根據之前的說明,找出 Button 元件的方式如下:
Button button = (Button) findViewById(R.id.button1);
- 有了按鈕物件 button,而且我們需要註冊事件發生時的處理物件,註冊方式如下:
button.setOnClickListener(事件處理物件);
- 根據 Android 的規定,事件處理物件的類別型態必須是 OnClickListener 的子類別,而且為了設計程式時程式碼比較簡單,因此常用的技巧是將該類別宣告成內隱類別(inner class),而宣告的方式如下:
private class HelloButton implements OnClickListener { … }
public void onClick(View view) { EditText input = (EditText) findViewById(R.id.editText1); input.setText("Hello " + input.getText()); }
- 定義完了 HelloButton 之後,在第二項中的語法就必須改成:
button.setOnClickListener(new HelloButton());
- 為了確認剛剛的說明,完整的程式碼如下所示:(請自行練習完成)
public class HelloName extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button button = (Button) findViewById(R.id.button1); button.setOnClickListener(new HelloButton()); } private class HelloButton implements OnClickListener { public void onClick(View view) { EditText input = (EditText) findViewById(R.id.editText1); input.setText("Hello " + input.getText()); } } }
- 讓我們再把事件處理過程,以這個範例再說明一下:當使用者在"按鈕"上點擊時,系統根據之前註冊的資料(事件處理物件是一個 HelloButton 的物件),呼叫該物件的 onClick() 方法;該方法立即取得文字欄位的內容,再結合上字串 Hello,然後顯示在問自欄位內。目前我們的寫法,事件處理物件是沒有名稱的,我們也可以把
button.setOnClickListener(new HelloButton());
HelloButton hb = new HelloButton(); button.setOnClickListener(hb);
Written by: 國立中興大學資管系呂瑞麟 Eric Jui-Lin Lu
沒有留言:
張貼留言