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.. Các phương th
Trang 1Xử 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ử
Trang 2dụ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ố
Trang 3cá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 ) ; }
Trang 4Phươ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 ( layout activity_main ); progress = new
ProgressDialog ( this ); b1 =( Button ) findViewById ( id button );
b2 =( Button ) findViewById ( id button2 ); b1 setOnClickListener ( new
View OnClickListener () @Override public void onClick ( View
v TextView txtView = ( TextView ) findViewById ( id textView ); txtView setTextSize ( 25 ); } });
b2 setOnClickListener ( new View OnClickListener () @Override
public void onClick ( View v ) { TextView txtView = ( TextView )
findViewById ( id textView ); txtView setTextSize ( 55 ); } }); } @Override public boolean onCreateOptionsMenu ( Menu menu ) {
getMenuInflater () inflate ( menu menu_main , menu ); return true ; }
@Override public boolean onOptionsItemSelected ( MenuItem item ) { //
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 −
Trang 5<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"
Trang 6<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