Xử lý sự kiện (Event Handling) trong Android




Các sự kiện (Event) là một cách hữu ích để thu thập dữ liệu về tương tác của người dùng với các thành phần tương tác của ứng dụng. Ví dụ như sự kiện nhấn vào nút hoặc chạm vào màn hình, … Android Framework duy trì một dãy sự hiện dựa trên nền tảng là First-In, First-out (FIFO). Bạn có thể nắm bắt các sự kiện này trong chương trình và thực hiện hành đồng thích hợp tùy theo yêu cầu.

Liên quan tới Quản lý sự kiện trong Android, bạn cần quan tâm 3 khái niệm sau: −

  • Event Listeners − Một Even Listener là một Interface trong lớp View mà chứa một phương thức callback. Các phương thức này sẽ có thể được gọi bởi Android Framework khi Listener đã đăng ký được kích hoạt bởi tương tác của người dùng với item trong giao diện UI.

  • Event Listeners Registration − Event Registration là tiến trình mà bởi đó một Event Handler được đăng ký với một Event Listener để mà Handler này được gọi khi Event Listener kích hoạt sự kiện.

  • Event Handlers − Khi một Event xảy ra, và chúng ta đã đăng ký một Event Listener cho sự kiện, thì Event Listener gọi Event Handler, là phương thức mà thực sự xử lý sự kiện đó.

Event Listeners & Event Handlers

Event Handler Event Listener & Miêu tả
onClick() OnClickListener()

Được gọi khi người dùng hoặc nhấn hoặc chạm hoặc tập trung vào bất cứ widget nào như button, text, image ... Bạn sẽ sử dụng event handler là onClick() để xử lý sự kiện như thế

onLongClick() OnLongClickListener()

Được gọi khi người dùng hoặc nhấn hoặc chạm vào bất cứ widget nào như button, text, image ... trong một hoặc vài giây. Bạn sẽ sử dụng event handler là onLongClick() để xử lý sự kiện như thế

onFocusChange() OnFocusChangeListener()

Được gọi khi widget mất tiêu điểm của nó, ví dụ như người dùng rời khỏi item trên view. Bạn sẽ sử dụng event handler là onFocusChange() để xử lý các sự kiện như thế

onKey() OnFocusChangeListener()

Được gọi khi người dùng tập trung vào item và nhấn hoặc thả ra một phím cứng trên thiết bị. Bạn sẽ sử dụng event handler là onKey() để xử lý sự kiện như thế

onTouch() OnTouchListener()

Được gọi khi người dùng nhấn key, nhả phím hoặc bất cứ động tác nào trên màn hình. Bạn sẽ sử dụng event handler là onTouch() để xử lý sự kiện như thế

onMenuItemClick() OnMenuItemClickListener()

Được gọi khi người dùng lựa chọn một item trong menu. Bạn sẽ sử dụng event handler là onMenuItemClick() để xử lý sự kiện như thế

onCreateContextMenu() onCreateContextMenuItemListener()

Được gọi khi context menu đang được xây dựng (là kết quả của một click liên tục trong thời gian dài)

Ngoài ra còn có nhiều Event Listener có sẵn như là một phần của lớp View như OnHoverListener, OnDragLister, … có thể cần cho ứng dụng của bạn. Vì thế, tôi đề nghị bạn nên tham khảo Offical Documentation để phát triển các ứng dụng Android phức tạp và tinh vi hơn.

Đăng ký Event Listener trong Android

Đăng ký Event là tiến trình mà bởi đó một Event Handler được đăng ký với một Event Listener để mà handler được gọi khi Event Listener kích hoạt sự kiện. Mặc dùy có một số cách phức tạp để đăng ký Event Handler của bạn cho bất kỳ sự kiện nào, nhưng tôi liệt kê chỉ 3 cách và bạn có thể sử dụng tùy theo tình huống.

  • Sử dụng một lớp Inner nặc danh

  • Lớp Activity triển khai Listener Interface

  • Sử dụng layout file là activity_main.xml để xác định trực tiếp Event Handler.

Phần dưới sẽ cung cấp cho bạn ví dụ chi tiết về 3 cách này. −

Touch Mode

Người sử dụng có thể tương tác với các thiết bị của họ bởi sử dụng các phím cứng hoặc nút hoặc chạm vào màn hình. Việc chạm vào màn hình đặt thiết bị vào trong Touch Mode. Sau đó, người dùng có thể tương tác với nó bằng việc chạm vào các nút ảo, hình ảnh, … Bạn có thể kiểm tra nếu thiết bị là trong Touch Mode bằng việc gọi phương thức isInTouchMode() của lớp View.

Touch Event

Sự kiện Focus trong Android

Một view hoặc widget thường được làm nổi bật hoặc hiển thị một con trỏ nhấp nháy khi nó trong Focus. Điều này chỉ rằng nó sẵn sàng để chấp nhận đầu vào từ người dùng.

  • isFocusable()Nó trả về true hoặc false

  • isFocusableInTouchMode() Kiểm tra để biết nếu view là focusable trong Touch Mode. (Một view là focusable khi sử dụng một phím cứng nhưng không là focusable khi thiết bị là trong Touch Mode)

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) ;
}

Phương thức onTouchEvent()

Ví dụ về xử lý sự kiện trong Android

Ở đây, bạn sẽ tạo một trình triển khai nặc danh của Listener và sẽ là hữu ích nếu mỗi lớp được áp dụng một control và bạn phải truyền các tham số cho Event Handler. Trong hướng tiếp cận này, các phương thức xử lý sự kiện có thể truy cập dữ liệu private của Activity. Không cần bất cứ tham chiếu nào để gọi Activity.

Nhưng nếu bạn áp dụng Handler cho nhiều hơn một control, bạn sẽ phải cắt và dán code cho Handler đó và nếu code cho Handler là dài, nó làm việc duy trì code trở nên khó khăn hơn.

Sau đây là các bước đơn giản để minh họa cách chúng ta sử dụng lớp Listener riêng rẽ để đăng ký và nắm bắt click event. Theo cách tương tự, bạn có thể triển khai Listener của bạn cho bất cứ kiểu sự kiện nào.

Sau đây là nội dung của Main Activity file đã được sửa đổi: src/com.example.myapplication/MainActivity.java.

package com.example.myapplication;

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);
         }
      });
   }
   
   @Override
   public boolean onCreateOptionsMenu(Menu menu) {
      // Inflate the menu; this adds items to the action bar if it is present.
      getMenuInflater().inflate(R.menu.menu_main, menu);
      return true;
   }
   
   @Override
   public boolean onOptionsItemSelected(MenuItem item) {
      // Handle action bar item clicks here. The action bar will
      // automatically handle clicks on the Home/Up button, so long
      // as you specify a parent activity in AndroidManifest.xml.
      
      int id = item.getItemId();
      
      //noinspection SimplifiableIfStatement
      if (id == R.id.action_settings) {
         return true;
      }
      return super.onOptionsItemSelected(item);
   }
}

Sau đây là nội dung của res/layout/activity_main.xml file −

<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>

Sau đây là nội dung của res/values/strings.xml để định nghĩa hai hằng −

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

Sau đây là nội dung mặc định của AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.myapplication"
   android:versionCode="1"
   android:versionName="1.0" >
   
   <uses-sdk
      android:minSdkVersion="8"
      android:targetSdkVersion="22" />
      
   <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>

Cuối cùng, bạn chạy ứng dụng Android vừa tạo ở trên.

Loạt bài hướng dẫn học AngularJS cơ bản và nâng cao của chúng tôi dựa trên nguồn tài liệu của: Tutorialspoint.com

Follow fanpage của team https://www.facebook.com/vietjackteam/ hoặc facebook cá nhân Nguyễn Thanh Tuyền https://www.facebook.com/tuyen.vietjack để tiếp tục theo dõi các loạt bài mới nhất về Java,C,C++,Javascript,HTML,Python,Database,Mobile.... mới nhất của chúng tôi.