Android - Xử lý sự kiện
Events are a useful way to collect data about a user's interaction with interactive components of Applications.Thích các lần nhấn nút hoặc chạm vào màn hình, v.v. Khung Android duy trì hàng đợi sự kiện dưới dạng cơ sở nhập trước, xuất trước (FIFO). Bạn có thể nắm bắt các sự kiện này trong chương trình của mình và thực hiện hành động thích hợp theo yêu cầu.
Có ba khái niệm sau liên quan đến Quản lý sự kiện của Android:
Event Listeners- Trình nghe sự kiện là một giao diện trong lớp View có chứa một phương thức gọi lại duy nhất. Các phương thức này sẽ được gọi bởi khuôn khổ Android khi Chế độ xem mà người nghe đã được đăng ký được kích hoạt bởi tương tác của người dùng với mục trong giao diện người dùng.
Event Listeners Registration - Đăng ký sự kiện là quá trình mà một Trình xử lý sự kiện được đăng ký với Trình xử lý sự kiện để trình xử lý được gọi khi Trình xử lý sự kiện kích hoạt sự kiện.
Event Handlers - Khi một sự kiện xảy ra và chúng ta đã đăng ký một trình xử lý sự kiện cho sự kiện, trình xử lý sự kiện sẽ gọi Trình xử lý sự kiện, đây là phương thức thực sự xử lý sự kiện.
Người nghe sự kiện & Người xử lý sự kiện
Xử lý sự kiện | Trình nghe & mô tả sự kiện |
---|---|
trong một cái nhấp chuột() | OnClickListener() Điều này được gọi khi người dùng nhấp hoặc chạm hoặc tập trung vào bất kỳ tiện ích con nào như nút, văn bản, hình ảnh, v.v. Bạn sẽ sử dụng trình xử lý sự kiện onClick () để xử lý sự kiện đó. |
onLongClick () | OnLongClickListener() Điều này được gọi khi người dùng nhấp hoặc chạm hoặc tập trung vào bất kỳ tiện ích con nào như nút, văn bản, hình ảnh, v.v. trong một hoặc nhiều giây. Bạn sẽ sử dụng trình xử lý sự kiện onLongClick () để xử lý sự kiện đó. |
onFocusChange () | OnFocusChangeListener() Điều này được gọi khi tiện ích mất tiêu điểm tức là. người dùng thoát khỏi mục xem. Bạn sẽ sử dụng trình xử lý sự kiện onFocusChange () để xử lý sự kiện đó. |
onKey () | OnFocusChangeListener() Điều này được gọi khi người dùng tập trung vào mục đó và nhấn hoặc nhả phím phần cứng trên thiết bị. Bạn sẽ sử dụng trình xử lý sự kiện onKey () để xử lý sự kiện đó. |
onTouch () | OnTouchListener() Điều 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 nào trên màn hình. Bạn sẽ sử dụng trình xử lý sự kiện onTouch () để xử lý sự kiện đó. |
onMenuItemClick () | OnMenuItemClickListener() Điều này được gọi khi người dùng chọn một mục menu. Bạn sẽ sử dụng trình xử lý sự kiện onMenuItemClick () để xử lý sự kiện đó. |
onCreateContextMenu () | onCreateContextMenuItemListener() Điều này được gọi khi menu ngữ cảnh đang được tạo (do kết quả của một "nhấp chuột dài) liên tục |
Có nhiều trình nghe sự kiện khác có sẵn như một phần của Viewnhư OnHoverListener, OnDragListener, v.v. có thể cần thiết cho ứng dụng của bạn. Vì vậy, tôi khuyên bạn nên tham khảo tài liệu chính thức về phát triển ứng dụng Android trong trường hợp bạn định phát triển một ứng dụng phức tạp.
Đăng ký người nghe sự kiện
Đăng ký sự kiện là quá trình mà Trình xử lý sự kiện được đăng ký với Trình xử lý sự kiện để trình xử lý được gọi khi Trình xử lý sự kiện kích hoạt sự kiện. Mặc dù có một số cách phức tạp để đăng ký trình lắng nghe sự kiện của bạn cho bất kỳ sự kiện nào, nhưng tôi sẽ chỉ liệt kê 3 cách hàng đầu, trong đó bạn có thể sử dụng bất kỳ cách nào trong số đó tùy theo tình hình.
Sử dụng lớp bên trong ẩn danh
Lớp Activity cài đặt giao diện Listener.
Sử dụng tệp Layout activity_main.xml để chỉ định trình xử lý sự kiện trực tiếp.
Phần dưới đây sẽ cung cấp cho bạn các ví dụ chi tiết về cả ba trường hợp -
Chế độ cảm ứng
Người dùng có thể tương tác với thiết bị của mình bằng cách sử dụng các phím hoặc nút phần cứng hoặc chạm vào màn hình. Chạm vào màn hình sẽ đưa thiết bị vào chế độ cảm ứng. Sau đó, người dùng có thể tương tác với nó bằng cách chạm vào các nút ảo trên màn hình, hình ảnh, v.v. Bạn có thể kiểm tra xem thiết bị có ở chế độ cảm ứng hay không bằng cách gọi phương thức isInTouchMode () của lớp View.
Tiêu điểm
Chế độ xem hoặc tiện ích con thường được đánh dấu hoặc hiển thị con trỏ nhấp nháy khi nó được lấy nét. Điều này cho thấy 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 xem chế độ xem có thể lấy nét được ở chế độ cảm ứng hay không. (Chế độ xem có thể được lấy nét khi sử dụng phím phần cứng nhưng không thể lấy nét khi thiết bị ở chế độ cảm ứng)
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) ;
}
Ví dụ về xử lý sự kiện
Đăng ký người nghe sự kiện bằng lớp bên trong ẩn danh
Ở đây bạn sẽ tạo một triển khai ẩn danh của trình lắng nghe và sẽ hữu ích nếu mỗi lớp chỉ được áp dụng cho một điều khiển duy nhất và bạn có lợi thế để chuyển các đối số cho trình xử lý sự kiện. Trong cách 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 riêng tư của Activity. Không cần tham chiếu để gọi Activity.
Nhưng nếu bạn áp dụng trình xử lý cho nhiều hơn một điều khiển, bạn sẽ phải cắt và dán mã cho trình xử lý và nếu mã cho trình xử lý dài, điều đó làm cho mã khó duy trì hơn.
Sau đây là các bước đơn giản để chỉ ra cách chúng ta sử dụng lớp Listener riêng biệt để đăng ký và nắm bắt sự kiện nhấp chuột. Cách tương tự, bạn có thể triển khai trình lắng nghe của mình cho bất kỳ loại sự kiện bắt buộc nào khác.
Bươc | Sự miêu tả |
---|---|
1 | Bạn sẽ sử dụng Android studio IDE để tạo một ứng dụng Android và đặt tên nó là myapplication theo gói com.example.myapplication như được giải thích trong chương Ví dụ về Hello World . |
2 | Sửa đổi tệp src / MainActivity.java để thêm trình xử lý và xử lý sự kiện nhấp chuột cho hai nút được xác định. |
3 | Sửa đổi nội dung gỡ rối của tệp res / layout / activity_main.xml để bao gồm các điều khiển giao diện người dùng Android. |
4 | Không cần phải khai báo hằng số chuỗi mặc định. Android studio sẽ chăm sóc các hằng số mặc định. |
5 | Chạy ứng dụng để khởi chạy trình giả lập Android và xác minh kết quả của những thay đổi được thực hiện trong ứng dụng. |
Sau đây là nội dung của tệp hoạt động chính được sửa đổi src/com.example.myapplication/MainActivity.java. Tệp này có thể bao gồm từng phương thức vòng đời cơ bản.
package com.example.myapplication;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
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);
}
});
}
}
Sau đây sẽ là nội dung của res/layout/activity_main.xml tập tin -
Ở đây abc chỉ ra về logo hướng dẫn
<?xml version="1.0" encoding="utf-8"?>
<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 sẽ là nội dung của res/values/strings.xml để xác định hai hằng số mới -
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">myapplication</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" >
<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>
Hãy cố gắng chạy myapplicationứng dụng. Tôi cho rằng bạn đã tạo raAVDtrong khi thiết lập môi trường. Để chạy ứng dụng từ Android Studio, hãy mở một trong các tệp hoạt động của dự án của bạn và nhấp vào
Bây giờ bạn thử nhấp vào hai nút lần lượt và bạn sẽ thấy phông chữ của Hello World văn bản sẽ thay đổi, điều này xảy ra vì phương thức xử lý sự kiện nhấp chuột đã đăng ký đang được gọi đối với mỗi sự kiện nhấp chuột.
Tập thể dục
Tôi sẽ khuyên bạn nên thử viết các trình xử lý sự kiện khác nhau cho các loại sự kiện khác nhau và hiểu sự khác biệt chính xác trong các loại sự kiện khác nhau và cách xử lý của chúng. Các sự kiện liên quan đến các widget menu, spinner, pickers có chút khác biệt nhưng chúng cũng dựa trên các khái niệm tương tự như đã giải thích ở trên.