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.
- Onclick in XML
- Inline anonymous listener
- Activity is listener
- Listener in variable
- Explicit listener class
- 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); } }