Hello World 進階了 -- 事件處理 Part 2-1

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 程式,其實這很正常。以下我們依據剛剛說過的步驟,以範例說明:

  1. 首先在程式中,我們必須先找出按鈕物件,根據之前的說明,找出 Button 元件的方式如下:
    Button button =  (Button) findViewById(R.id.button1);
          
  2.  

  3. 有了按鈕物件 button,而且我們需要註冊事件發生時的處理物件,註冊方式如下:
    button.setOnClickListener(事件處理物件);
          
  4.  

  5. 根據 Android 的規定,事件處理物件的類別型態必須是 OnClickListener 的子類別,而且為了設計程式時程式碼比較簡單,因此常用的技巧是將該類別宣告成內隱類別(inner class),而宣告的方式如下:
    private class HelloButton implements OnClickListener { … }

     

    也就是說,我們宣告了一個名為 HelloButton 的類別,而該類別是 OnClickListener 的子類別;根據 Android 的規定,在按鈕上發生點擊事件時,一定會呼叫該事件處理物件的 onClick() 方法,因此我們必須在 HelloButton 類別中定義出如下的方法,至於方法的內容跟之前的一樣,在此就不再贅述:
    public void onClick(View view) { 
      EditText input = (EditText) findViewById(R.id.editText1);
      input.setText("Hello  " + input.getText());
    }
  6.  

  7. 定義完了 HelloButton 之後,在第二項中的語法就必須改成:
    button.setOnClickListener(new HelloButton());
          
  8.  

  9. 為了確認剛剛的說明,完整的程式碼如下所示:(請自行練習完成)
    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());
          }
        }
    }
    
          
  10. 讓我們再把事件處理過程,以這個範例再說明一下:當使用者在"按鈕"上點擊時,系統根據之前註冊的資料(事件處理物件是一個 HelloButton 的物件),呼叫該物件的 onClick() 方法;該方法立即取得文字欄位的內容,再結合上字串 Hello,然後顯示在問自欄位內。目前我們的寫法,事件處理物件是沒有名稱的,我們也可以把
    button.setOnClickListener(new HelloButton());
          

    改成

          HelloButton hb = new HelloButton();
          button.setOnClickListener(hb);
          

    這樣子一來,事件處理物件的名稱就是 hb;習慣了這種寫法之後,大多數的程式設計人員不會為事件處理物件命名。


Written by: 國立中興大學資管系呂瑞麟 Eric Jui-Lin Lu

沒有留言:

張貼留言