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 HandlerEvent 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.
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.
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 AndroidMộ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)
Ở đâ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.
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 mặc định của AndroidManifest.xml
Cuối cùng, bạn chạy ứng dụng Android vừa tạo ở trên.
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) ;
}
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ằngxmlns: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>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">myapplication</string>
<string name="action_settings">Settings</string>
</resources>
<?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>
<resources>
<string name="app_name">myapplication</string>
<string name="action_settings">Settings</string>
</resources>
<?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>
Sau đây là nội dung mặc định của AndroidManifest.xml
Cuối cùng, bạn chạy ứng dụng Android vừa tạo ở trên.
0 nhận xét:
Đăng nhận xét