Đặt vấn đề về event
Khi mới lập trình giao diện (GUI), lập trình viên sẽ tiếp cận khái niệm event, tại sao khi click vào 1 button lại có 1 phương thức để xử lý và truyền những tham số cần thiết để sử dụng như vậy?
Ví dụ khi click vào Button
trong Android:
Button btnExample = (Button) findViewById(R.id.btnExample);
btnExample.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Do something here
}
});
Hay khi nhấn vào 1 item trên ListView
.
lvPlace.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// TODO something
}
});
Event là gì?
Event được hiểu là 1 khi hành động được xảy ra thì phản hồi với hành động như thế nào? Ví dụ khi nhấn vào button thì xử lý những đoạn mã trong phương thức callback onClick
của interface OnClickListener
.
Giả sử có 1 sản phẩm, khi giá của sản phẩm này thay đổi thì xuất ra thông báo, cùng phân tích hai trường hợp theo hướng if else và event.
if else
Được hiểu đúng nghĩa là: "Nếu giá của sản phẩm thay đổi thì xuất ra thông báo".
event
Được hiểu là: "Một khi giá của sản phẩm thay đổi thì xuất ra thông báo".
Xây dựng Event trong Android
Ví dụ có 1 sản phẩm và khi sản phẩm đó có giá thay đổi thì sẽ phát sinh ra sự kiện thông báo giá thay đổi và gửi kèm thông tin là giá cũ và giá mới.
Class Product
bao gồm thuộc tính là:
name
: tên sản phẩm.price
: giá sản phẩm.
public class Product {
private String name;
private double price;
public Product() {
}
public Product(String name, double price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}
Bước thứ 2, tạo 1 interface OnPriceChanged
public interface OnPriceChanged {
public void onChanged(double oldPrice, double newPrice);
}
Cuối cùng triển khai event OnPriceChanged
trong model Product
public class Product {
private String name;
private double price;
private OnPriceChanged mListener;
public Product() {
}
public Product(String name, double price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
if(this.price == price)
return;
double oldPrice = this.price;
this.price = price;
if(mListener != null){
mListener.onChanged(oldPrice, this.price);
}
}
public void setOnPriceChangedListener(OnPriceChanged listener){
mListener = listener;
}
}
Ở đây sẽ triển khai event trong phương thức setPrice()
để kiểm tra giá thay đổi. Nếu giá thay đổi và có đăng kí event (nghĩa là mListener != null
) thì phát sinh sự kiện onChanged
và gửi kèm 2 giá trị là oldPrice
và newPrice
của Product
.
Sử dụng Event
Product product = new Product("Iphone 7 Plus", 20000000);
product.setOnPriceChangedListener(new OnPriceChanged() {
@Override
public void onChanged(double oldPrice, double newPrice) {
Log.e(TAG, "onChanged: " + "oldPrice: " + oldPrice + ", newPrice: " + newPrice);
}
});
product.setPrice(25000000);
Trước tiên sẽ tạo 1 project và ấn định giá trị ban đầu cho nó với name
là "iPhone 7 Plus" và price
có giá trị 2000000. Tiếp theo sẽ đặt bộ lắng nghe sự kiện trên đối tượng product
để lắng nghe sự kiện onChanged
(sự kiện giá thay đổi của sản phẩm).
Và mỗi khi thay đổi giá của sản phẩm thì phương thức onChanged()
luôn được gọi.