Xử lý sự kiện trong Android

Sự kiện trong android là một cách  để thu thập dữ liệu về sự tương tác của người dùng với các thành phần của ứng dụng. Giống như nút bấm hoặc các thao tác cảm ứng trên màn hình ,.. vv. Trong ứng dụng Android duy trì một tá các thao tác sự kiện, đặc biệt là Button dùng để tạo sự kiện. Bạn có thể nắm bắt những sự kiện trong app của bạn và có hành động thích hợp theo yêu cầu.

Ba khái niệm liên quan đến quản lý sự kiện Android :

  1. Event Listeners : Event Listeners là một giao diện trong lớp View có chứa một phương thức đơn gọi lại duy nhất. Những phương thức này sẽ được gọi bởi các framework Android khi View  đã được đăng ký được kích hoạt bởi người dùng tương tác với các mục trong giao diện người dùng.
  2. Event Listeners Registration : Event Registration là quá trình mà theo đó một Event Handlers được đăng ký với Event Listener để xử lý được gọi khi Event Listener  kích hoạt.
  3. Event Handlers : Khi một sự kiện xảy ra và chúng đã đăng ký một Event Listeners cho sự kiện này, Event Listeners  bắt đầu gọi Event Handlers, đó là phương thức chính để xử lý sự kiện.
Xử lý sự kiện trong android - Event handling in android
Xử lý sự kiện trong android – Event handling in android

Event Listeners & Event Handlers

Xử lý sự kiện Event Listener & Chú thích
onClick() OnClickListener ()

Hàm này được gọi khi người dùng  chạm  vào bất kỳ widget button, văn bản, hình ảnh ,… Bạn sẽ sử dụng onClick () event handler để xử lý các sự kiện như vậy.

onLongClick ()

OnLongClickListener ()

Hàm này được gọi khi người dùng nhấn vào bất kỳ widget button, văn bản, hình ảnh, vv trong khoảng 2s trở lên. Bạn sẽ sử dụng onLongClick () event handler để xử lý các sự kiện như vậy.

onFocusChange ()

OnFocusChangeListener ()

Hàm này được gọi khi người dùng thay đổi hay rời khỏi đối tượng đang lựa chọn, bạn sẽ sử dụng onFocusChange() event handler để xử lý sự kiện này.

onkey ()

OnFocusChangeListener ()

Hàm này được gọi khi người sử dụng nhấn giữ một phím cứng nào đó trên thiết bị. Bạn sẽ sử dụng onKey () event handler để xử lý các sự kiện như vậy.

onTouch ()

OnTouchListener ()

Hàm này được gọi khi người dùng nhấn phím, nhả phím, hoặc bất kỳ cử chỉ chuyển động trên màn hình. Bạn sẽ sử dụng onTouch () event handler để xử lý các sự kiện như vậy.

onMenuItemClick ()

OnMenuItemClickListener ()

Hàm này được gọi khi người dùng chọn một mục trình đơn (menu item). Bạn sẽ sử dụng onMenuItemClick () event handler để xử lý các sự kiện như vậy.

onCreateContextMenu ()

onCreateContextMenuItemListener ()

Hàm này được gọi khi các menu ngữ cảnh đang được xây dựng.

Event Listeners Registration

Event Registration là quá trình mà theo đó một Event Handler được đăng ký với Event Listener để xử lý được gọi khi Event Listener bắt đầu các sự kiện. Mình sẽ liệt kê 3 cách được sử dụng nhiều nhất, trong đó bạn có thể sử dụng bất kỳ của 1 trong 3 cách này .

  • Sử dụng một Anonymous Inner Class.
  • Sử dụng lớp Hoạt động thực hiện giao diện Listener.
  • Sử dụng Layout file activity_main.xml chỉ định xử lý sự kiện trực tiếp.

Demo xử lý sự kiện trong Android

Trong ví dụ dưới đây mình xin làm bài demo về các phép toán công trừ nhân chia được nhập vào từ bàn phím và hiện ra kết quả khi click vào button tương ứng:

 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:orientation="vertical"
    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="dev4u.com.demoeventhandling.MainActivity">

    <EditText
        android:id="@+id/edSoA"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Nhập số A"
        android:inputType="number" />

    <EditText
        android:id="@+id/edSoB"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Nhập số B"
        android:inputType="number" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:weightSum="4">

        <Button
            android:id="@+id/btnCong"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="Cộng" />

        <Button
            android:id="@+id/btnTru"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text=" Trừ" />

        <Button
            android:id="@+id/btnNhan"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="Nhân" />

        <Button
            android:id="@+id/btnChia"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="Chia" />

    </LinearLayout>

    <TextView
        android:id="@+id/tvKetQua"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:text="Kết Quả : "
        android:textSize="20dp"
        android:textStyle="bold" />

</LinearLayout>

MainActivity

package dev4u.com.demoeventhandling;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    //Khai báo các đối tượng View có trong file activity_main.xml
    EditText edSoA, edSoB;
    Button btnCong, btnTru, btnNhan, btnChia;
    TextView tvKetQua;

    int soA;
    int soB;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //Định nghĩa các đối tượng View tương ứng với các ID có trong file xml
        edSoA = (EditText) findViewById(R.id.edSoA);
        /*  Bạn cũng có thể khai báo trực tiếp ở đây bằng cú pháp sau nhưng không nên
            vì sẽ khó quản lý code của bạnysvaf trông thiếu chuyên nghiệp
            EditText edSoA=(EditText) findViewById(R.id.edSoA);
        */
        edSoB = (EditText) findViewById(R.id.edSoB);
        btnCong = (Button) findViewById(R.id.btnCong);
        btnTru = (Button) findViewById(R.id.btnTru);
        btnNhan = (Button) findViewById(R.id.btnNhan);
        btnChia = (Button) findViewById(R.id.btnChia);
        tvKetQua = (TextView) findViewById(R.id.tvKetQua);

        //Xử lý sự kiện cho các button Cộng Trừ Nhân Chia
        //Đây là cách xử lý sự kiện cho các button được sử dụng phổ biến nhất
        btnCong.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                epKieu();
                //Gán kết quả cho TextView KetQua
                tvKetQua.setText("Kết Quả: " + Cong(soA, soB));
            }
        });
        btnTru.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                epKieu();
                //Gán kết quả cho TextView KetQua
                tvKetQua.setText("Kết Quả: " + Tru(soA, soB));
            }
        });
        btnNhan.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                epKieu();
                //Gán kết quả cho TextView KetQua
                tvKetQua.setText("Kết Quả: " + Nhan(soA, soB));
            }
        });
        btnChia.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                epKieu();
                //Gán kết quả cho TextView KetQua
                tvKetQua.setText("Kết Quả: " + Chia(soA, soB));
            }
        });
    }

    //Ép kiểu cho số A và số B, vì mặc định tham sô truyền vào là kiểu ký tự
    private void epKieu() {
        soA = Integer.parseInt(edSoA.getText().toString());
        soB = Integer.parseInt(edSoB.getText().toString());
    }

    // Hàm cộng 2 số a và b
    private int Cong(int a, int b) {
        return (a + b);
    }

    // Hàm trừ 2 số a và b
    private int Tru(int a, int b) {
        return (a - b);
    }

    // Hàm nhân 2 số a và b
    private int Nhan(int a, int b) {
        return (a * b);
    }

    // Hàm chia 2 số a và b
    private double Chia(double a, double b) {
        return (a / b);
    }
}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="dev4u.com.demoeventhandling">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Lời kết

Mặc dù là hơi loằng ngoằng dài dòng và khó hiểu 1 chút nhưng mong là qua bài viết này bạn có thể hiểu rõ hơn một chút về xử lý sự kiện trong ứng dụng android – Event handling in Android. Trong quá trình tìm hiểu nếu bạn gặp bất kỳ lỗi nào hay có bất kỳ góp ý hay chia sẻ gì, mong bạn có thể để lại comment bên dưới hoặc gửi mail về [email protected]. Xin cảm ơn!!

Gom Marker trong Android với Google Maps Android API – Google Maps Android Marker Clustering Utility Sử dụng SwipeRefreshLayout trong ứng dụng Android Hướng dẫn tạo Material Dialog Bottom Sheet Android Tạo context menu trong Android – ActionBar ActionMode.CallBack Example Retrofit và Volley thư viện nào tốt hơn Hướng dẫn sử dụng thư viện Volley trong Android Tạo Web Service bằng PHP và MYSQL cho ứng dụng di động – Part 2 Tạo Web Service bằng PHP và MYSQL cho ứng dụng di động – Part 1 Hàm chuyển đổi Timestamp thành Datetime trong Android và JavaScript Design Patterns là gì? Tạo Project Android theo mẫu Design Patterns(Part 2)

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.