Bài 4: Các kiểu lập trình sự kiện 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)

Ở Bài này mình sẽ trình bày 6 kiểu lập trình sự kiện trong Android đặc biệt là Button dùng để tạo sự kiện.

  1. Onclick in XML
  2. Inline anonymous listener
  3. Activity is listener
  4. Listener in variable
  5. Explicit listener class
  6. View Subclassing

Dưới  đây là một bài tập đầy đủ các kiểu xử lý ở trên đã được mình comment lại rất dễ hiểu:



1. main_activity.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:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:orientation="vertical"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="numberDecimal"
        android:ems="10"
        android:id="@+id/edtNhapSoA"
        android:hint="Nhập Số A:" />

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="numberDecimal"
        android:ems="10"
        android:id="@+id/edtNhapSoB"
        android:hint="Nhập Số B:"
        android:layout_below="@+id/edtNhapSoA" />

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

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="+"
            android:onClick="PhepCong"
            android:id="@+id/btnCong" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="-"
            android:id="@+id/btnTru" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="*"
            android:id="@+id/btnNhan" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="/"
            android:id="@+id/btnChia" />
    </LinearLayout>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="Kết Quả:"
        android:id="@+id/tvKetQua"
        android:layout_marginTop="140dp" />

</LinearLayout>

2. MainActivity

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    Button btnPhepCong, btnPhepTru,btnPhepChia,btnPhepNhan;
    EditText mNhapSoA,mNhapSoB;
    TextView mKetQua;

    @Override
    protected void onCreate(Bundle savedInstanceState)  {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        addControls();
    //SỰ KIỆN CLICK
    // Variable listenner
        btnPhepNhan.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                double ketqua = Double.parseDouble(mNhapSoA.getText().toString()) * Double.parseDouble(mNhapSoB.getText().toString());
                mKetQua.setText("Kết Quả: " + mNhapSoA.getText().toString() + "*"
                        + mNhapSoB.getText().toString() + "=" + ketqua);
            }
        });
    // Anonymous listenner.
        View.OnClickListener listener = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
              if (v == btnPhepChia) {
                    double ketqua = Double.parseDouble(mNhapSoA.getText().toString()) / Double.parseDouble(mNhapSoB.getText().toString());
                    mKetQua.setText("Kết Quả: " + mNhapSoA.getText().toString() + "/"
                            + mNhapSoB.getText().toString() + "=" + ketqua);
                }
            }
        };
        btnPhepChia.setOnClickListener(listener);
        btnPhepTru.setOnClickListener(this);
    }
    // Khai báo trong XML
    public void PhepCong (View v){
        double ketqua = Double.parseDouble(mNhapSoA.getText().toString()) + Double.parseDouble(mNhapSoB.getText().toString());
        mKetQua.setText("Kết Quả: " + mNhapSoA.getText().toString() + "+"
                + mNhapSoB.getText().toString() + "=" + ketqua);
    }
    //Activity listenner  (Khuyến khích sử dụng)  implements View.OnClickListener
    @Override
    public void onClick(View v) {
        if (v == btnPhepTru) {
            double ketqua = Double.parseDouble(mNhapSoA.getText().toString()) - Double.parseDouble(mNhapSoB.getText().toString());
            mKetQua.setText("Kết Quả: " + mNhapSoA.getText().toString() + "-"
                    + mNhapSoB.getText().toString() + "=" + ketqua);
        }
    }
    
    private void addControls() {
        btnPhepCong = (Button) findViewById(R.id.btnCong);
        btnPhepChia = (Button) findViewById(R.id.btnChia);
        btnPhepTru = (Button) findViewById(R.id.btnTru);
        btnPhepNhan = (Button) findViewById(R.id.btnNhan);
        mNhapSoA = (EditText) findViewById(R.id.edtNhapSoA);
        mNhapSoB = (EditText) findViewById(R.id.edtNhapSoB);
        mKetQua = (TextView) findViewById(R.id.tvKetQua);
    }
}

 

Nguyễn Linh

Chia sẻ để cùng tiến bộ...