Android筆記(7):事件Event觸發與處理

Photo by Shuvro Mojumder on Unsplash


在手機/平板的圖形介面應用程式,都是通過「事件 Event」來進行人機互動的。使用者對圖形介面的操作就是事件,在 Android 的系統分成實體按鍵事件和螢幕觸控類事件兩大類。實體按鍵事件包括按下、放開和長按等;螢幕的觸控式事件包括按一下事件、長按事件和觸摸事件等。

在 Android 中提供了兩種方式的事件處理,一種是使用監聽事件的方式,另一種是使用回調(Call Back)的方式來處理事件。對於通用性的事件,一般常用回調的事件處理方式,對於某些特定的事件,無法採用回調的事件處理方式處理時,就只能採用監聽事件的方式來處理。以下就來瞭解如何設定這兩種事件處理的方法。

[事件監聽處理]

要進行監聽的事件處理,做法是在螢幕上的 UI 元件綁定特定的事件監聽器。在事件監聽的處理模型中,主要有以下 3 種對象:

  • 事件來源(Event Source):即產生事件的來源,通常是各種元件,例如,按鈕、功能表等。
  • 事件(Event):事件中封裝了 UI 元件上發生的特定事件的具體資訊,如果監聽器需要獲取 UI 元件上所發生事件的相關資訊,一般通過Event 物件來傳遞。
  • 事件監聽器(Event Listener):監聽事件來源所發生的事件,並對不同的事件做出回應與處理。

有關事件處理流程,是先將事件監聽器註冊到事件來源,當外部動作觸發事件來源,產生事件後,再傳到事件監聽器觸發相關處理程序,流程如下圖:
撰寫事件監聽的設定是在佈局 XML 檔的 UI 元件設定一個 onClick 的執行程序,再到 Java 主程式,建立物件連結後,撰寫程式邏輯,如以下步驟:

(1) 設定佈局 XML 檔內 UI 元件 onClick 時觸發的程序名稱。以一個按鍵為例,如下圖紅框處:

(2) 進入 MainActivity.java ,編寫 java 程式:
1. 定義一個元件變數
 Button btn;

2. 透過佈局檔中定義的 ID 名稱,藉由 findViewById 取得該 UI 元件。
 btn = findViewById(R.id.btn);

3. 定義 onClick 觸發的程序,名稱定為在佈局 XML 中定義的 OnClick 事件名稱
 public void btnClick(View view) {
      Toast.makeText(this, "您按下測試按鈕...", Toast.LENGTH_LONG).show();
 }
(3) 執行程式。

MainActivity.java 程式如下:

上述僅使用 onClick 的方法觸發事件,以下的寫法是使用內部類別作為 OnClick 的事件監聽器:
(1) 先在 Button 設定一個 ID,名為 btn。
(2) 開啟 java 目錄下的 MainActivity.java。
(3) 在 onCreate()方法前定義 Button 類別。
Button btn;  
(4) 在 onCreate()的方法中添加如下程式:
btn = (Button) findViewById(R.id.btn);  //透過ID取得佈局檔中的按鈕
btn.setOnClickListener(btnCount);   
(5) 增加 setOnClickListener 事件監聽程序:
private Button.OnClickListener btnCount = new Button.OnClickListener() {

	public void onClick(View v) {
		//編寫要執行的動作代碼
		Toast.makeText(MainActivity.this, "點擊了Button1", Toast.LENGTH_SHORT).show();
	}
};    
(6) 執行程式。

MainActivity.java 程式如下:


[事件回調(CallBack)處理]

另一個事件處理的方法是重寫 Android 元件或 Activity 的特定的回調(Call Back)方法,回調的事件處理方式比事件監聽的簡單,為了使用回調機制來處理 GUI元件所發生的事件,需要為該元件提供對應的事件處理方法,可以通過繼承 GUI 元件類,並重寫該類的事件處理方法來實現。 從代碼實現的角度來看,基於。 為了實現回檔機制的事件處理,Android 為所有GUI 元件都提供了一些事件處理的回檔方法,
經常會重寫的方法: OnTouchEvent()、OnKeyDown()及OnKeyUp()

(1) 開啟 MainActivity.java ,編寫 java 程式:
(2) 在編輯畫面按右鍵,選擇「Generate」,再選擇 「Override Mathods」。

(3) 出現各種系統可以 Override 的 Mathods,輸入 OnTouch... 找到 OnTouchEvent():

按下確認後,出現以下 onTouchEvent 的方法,再將程式邏輯寫在{}內即可。以觸摸螢幕再使用 Toast 將訊息呈現在下方,程式如下:
  @Override
  public boolean onTouchEvent(MotionEvent event) {
      Toast.makeText(this, "您點觸了螢幕畫面...", Toast.LENGTH_LONG).show();
      return super.onTouchEvent(event);
  }
上述兩個方法的程式如以下畫面:

[參考資料]


Post a Comment

較新的 較舊