• Android Video Tutorials

Android - 事件處理



事件是收集使用者與應用程式互動式元件互動資料的一種實用方法。例如按鈕按下或螢幕觸控等。Android 框架維護一個事件佇列,採用先進先出 (FIFO) 的方式。您可以在程式中捕獲這些事件,並根據需要採取相應的操作。

以下三個概念與 Android 事件管理相關:

  • 事件監聽器 - 事件監聽器是 View 類中的一個介面,包含單個回撥方法。當向其註冊監聽器的 View 被使用者與 UI 中的專案互動觸發時,這些方法將由 Android 框架呼叫。

  • 事件監聽器註冊 - 事件註冊是事件處理程式與事件監聽器註冊的過程,以便在事件監聽器觸發事件時呼叫處理程式。

  • 事件處理程式 - 當事件發生並且我們為該事件註冊了事件監聽器時,事件監聽器將呼叫事件處理程式,即實際處理事件的方法。

事件監聽器和事件處理程式

事件處理程式 事件監聽器和描述
onClick()

OnClickListener()

當用戶點選、觸控或聚焦於任何小部件(如按鈕、文字、影像等)時呼叫此方法。您將使用 onClick() 事件處理程式來處理此類事件。

onLongClick()

OnLongClickListener()

當用戶點選、觸控或聚焦於任何小部件(如按鈕、文字、影像等)一秒或更多秒時呼叫此方法。您將使用 onLongClick() 事件處理程式來處理此類事件。

onFocusChange()

OnFocusChangeListener()

當小部件失去焦點(即使用者離開檢視專案)時呼叫此方法。您將使用 onFocusChange() 事件處理程式來處理此類事件。

onKey()

OnFocusChangeListener()

當用戶聚焦於專案並按下或釋放裝置上的硬體鍵時呼叫此方法。您將使用 onKey() 事件處理程式來處理此類事件。

onTouch()

OnTouchListener()

當用戶按下鍵、釋放鍵或螢幕上出現任何移動手勢時呼叫此方法。您將使用 onTouch() 事件處理程式來處理此類事件。

onMenuItemClick()

OnMenuItemClickListener()

當用戶選擇選單項時呼叫此方法。您將使用 onMenuItemClick() 事件處理程式來處理此類事件。

onCreateContextMenu()

onCreateContextMenuItemListener()

構建上下文選單時呼叫此方法(作為持續“長按”的結果)。

作為 **View** 類的一部分,還有許多其他事件監聽器可用,例如 OnHoverListener、OnDragListener 等,您的應用程式可能需要這些監聽器。因此,如果您要開發複雜的應用程式,我建議您參考 Android 應用程式開發的官方文件。

事件監聽器註冊

事件註冊是事件處理程式與事件監聽器註冊的過程,以便在事件監聽器觸發事件時呼叫處理程式。雖然有幾種棘手的註冊事件監聽器的方法,但我只列出三種最佳方法,您可以根據情況使用其中任何一種。

  • 使用匿名內部類

  • Activity 類實現 Listener 介面。

  • 使用佈局檔案 activity_main.xml 直接指定事件處理程式。

以下部分將提供關於這三種場景的詳細示例:

觸控模式

使用者可以使用硬體鍵或按鈕或觸控式螢幕幕與裝置互動。觸控式螢幕幕會使裝置進入觸控模式。然後,使用者可以透過觸控式螢幕幕上的虛擬按鈕、影像等與之互動。您可以透過呼叫 View 類的 isInTouchMode() 方法來檢查裝置是否處於觸控模式。

焦點

當檢視或小部件處於焦點時,通常會突出顯示或顯示閃爍的游標。這表示它已準備好接受使用者的輸入。

  • isFocusable() - 返回 true 或 false

  • isFocusableInTouchMode() - 檢查檢視在觸控模式下是否可聚焦。(在使用硬體鍵時,檢視可能可聚焦,但在裝置處於觸控模式時則不可聚焦)。

android:foucsUp="@=id/button_l"

onTouchEvent()

public boolean onTouchEvent(motionEvent event){
   switch(event.getAction()){
      case TOUCH_DOWN:
      Toast.makeText(this,"you have clicked down Touch button",Toast.LENTH_LONG).show();
      break();
   
      case TOUCH_UP:
      Toast.makeText(this,"you have clicked up touch button",Toast.LENTH_LONG).show();
      break;
   
      case TOUCH_MOVE:
      Toast.makeText(this,"you have clicked move touch button"Toast.LENTH_LONG).show();
      break;
   }
   return super.onTouchEvent(event) ;
}

事件處理示例

使用匿名內部類註冊事件監聽器

在這裡,您將建立監聽器的匿名實現,如果每個類只應用於單個控制元件,這將非常有用,並且您可以將引數傳遞給事件處理程式。在這種方法中,事件處理程式方法可以訪問 Activity 的私有資料。不需要呼叫 Activity 的引用。

但是,如果您將處理程式應用於多個控制元件,則必須剪下和貼上處理程式的程式碼,如果處理程式的程式碼很長,則會使程式碼難以維護。

以下是顯示我們將如何使用單獨的 Listener 類來註冊和捕獲點選事件的簡單步驟。您可以類似地為任何其他所需的事件型別實現監聽器。

步驟 描述
1 您將使用 Android Studio IDE 建立一個 Android 應用程式,並在包 `com.example.myapplication` 下將其命名為 `myapplication`,如“Hello World 示例”章節中所述。
2 修改 `src/MainActivity.java` 檔案以新增兩個定義的按鈕的點選事件監聽器和處理程式。
3 修改 `res/layout/activity_main.xml` 檔案的預設內容以包含 Android UI 控制元件。
4 無需宣告預設字串常量。Android Studio 會處理預設常量。
5 執行應用程式以啟動 Android 模擬器並驗證對應用程式所做的更改的結果。

以下是修改後的主活動檔案 `src/com.example.myapplication/MainActivity.java` 的內容。此檔案可以包含每個基本生命週期方法。

package com.example.myapplication;

import android.app.ProgressDialog;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends ActionBarActivity {
   private ProgressDialog progress;
   Button b1,b2;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      progress = new ProgressDialog(this);

      b1=(Button)findViewById(R.id.button);
      b2=(Button)findViewById(R.id.button2);
      b1.setOnClickListener(new View.OnClickListener() {
         
         @Override
         public void onClick(View v) {
            TextView txtView = (TextView) findViewById(R.id.textView);
            txtView.setTextSize(25);
         }
      });

      b2.setOnClickListener(new View.OnClickListener() {
         
         @Override
         public void onClick(View v) {
            TextView txtView = (TextView) findViewById(R.id.textView);
            txtView.setTextSize(55);
         }
      });
   }
}

以下是 `res/layout/activity_main.xml` 檔案的內容:

這裡 abc 指的是 tutorialspoint 徽標
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 
   xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:paddingBottom="@dimen/activity_vertical_margin"
   android:paddingLeft="@dimen/activity_horizontal_margin"
   android:paddingRight="@dimen/activity_horizontal_margin"
   android:paddingTop="@dimen/activity_vertical_margin"
   tools:context=".MainActivity">
   
   <TextView
      android:id="@+id/textView1"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Event Handling "
      android:layout_alignParentTop="true"
      android:layout_centerHorizontal="true"
      android:textSize="30dp"/>
      
   <TextView
      android:id="@+id/textView2"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Tutorials point "
      android:textColor="#ff87ff09"
      android:textSize="30dp"
      android:layout_above="@+id/imageButton"
      android:layout_centerHorizontal="true"
      android:layout_marginBottom="40dp" />
      
   <ImageButton
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:id="@+id/imageButton"
      android:src="@drawable/abc"
      android:layout_centerVertical="true"
      android:layout_centerHorizontal="true" />
      
   <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Small font"
      android:id="@+id/button"
      android:layout_below="@+id/imageButton"
      android:layout_centerHorizontal="true" />
      
   <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Large Font"
      android:id="@+id/button2"
      android:layout_below="@+id/button"
      android:layout_alignRight="@+id/button"
      android:layout_alignEnd="@+id/button" />
      
   <TextView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Hello World!"
      android:id="@+id/textView"
      android:layout_below="@+id/button2"
      android:layout_centerHorizontal="true"
      android:textSize="25dp" />
      
</RelativeLayout>

以下是 `res/values/strings.xml` 檔案的內容,用於定義兩個新的常量:

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <string name="app_name">myapplication</string>
</resources>

以下是 `AndroidManifest.xml` 檔案的預設內容:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.myapplication" >
      
   <application
      android:allowBackup="true"
      android:icon="@drawable/ic_launcher"
      android:label="@string/app_name"
      android:theme="@style/AppTheme" >
      
      <activity
         android:name="com.example.myapplication.MainActivity"
         android:label="@string/app_name" >
      
         <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
         </intent-filter>
      
      </activity>
      
   </application>
</manifest>

讓我們嘗試執行您的 `myapplication` 應用程式。我假設您在進行環境設定時建立了您的 AVD。要在 Android Studio 中執行該應用程式,請開啟專案的活動檔案之一,然後單擊工具欄中的執行 Eclipse Run Icon 圖示。Android Studio 將應用程式安裝到您的 AVD 並啟動它,如果您的設定和應用程式一切正常,它將顯示以下模擬器視窗:

Android Event Handling

現在嘗試依次單擊兩個按鈕,您將看到 **Hello World** 文字的字型會更改,這是因為針對每個點選事件都呼叫了已註冊的點選事件處理程式方法。

練習

我建議嘗試為不同的事件型別編寫不同的事件處理程式,並瞭解不同事件型別及其處理的精確區別。與選單、微調器、選擇器小部件相關的事件略有不同,但它們也基於上述相同的概念。

廣告
© . All rights reserved.