Giới thiệu
Chắc hẳn khi mới lập trình giao diện (GUI) các bạn rất thắc mắc là Event là gì, tại sao khi chúng ta click vào một button lại có 1 phương thức để xử lý như vậy và truyền những tham số cần thuyết qua hàm này cho chúng ta sử dụng. Ví dụ khi click vào Button trong Android
1 2 3 4 5 6 7 |
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 một item trên ListView.
1 2 3 4 5 6 |
lvPlace.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { //TODO somthing } }); |
Thật sự, đối với những người mới tiếp xúc rất khó hiểu, tại sao lại có những event này và nó được xây dựng như thế nào. Thì bài viết này sẽ giải thích cho bạn rõ và xây dựng event để các bạn nắm rõ mảng kiến thức này.
Event là gì?
Event được hiểu là một khi hành động được xảy ra thì sẽ phát sinh, hay thông báo cho chúng ta sẽ phản hồi với hành động như thế nào. Ví dụ khi click vào button thì chúng ta sẽ xử lý những đoạn mã của chúng ta trong phương thức callback onClick của interface OnClickListener.
Tôi nói câu trên nhiều bạn nghĩ sao nó giống if else vậy. Chúng ta cùng phân tích nhé.
Giả sử tôi có 1 sản phẩm, khi giá của sản phẩm này thay đổi thì tôi sẽ 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 Java, Android
Để dễ hiểu hơn chúng ta sẽ cùng nhau xây dựng Event trong Android như sau.
Tôi có một 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 hồm hay thuộc tính là name (tên sản phẩm) và price (giá sản phẩm)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
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ứ hai chúng ta sẽ tạo một interface OnPriceChanged
1 2 3 |
public interface OnPriceChanged { public void onChanged(double oldPrice, double newPrice); } |
Cuối chúng là chúng ta sẽ triển khai event OnPriceChanged trong model Product của chúng ta
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
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 chúng ta 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ì chúng ta sẽ phát sinh sự kiện onChanged và gửi kèm hai giá trị là oldPrice và newPrice của Product.
Sử dụng Event
1 2 3 4 5 6 7 8 9 |
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 tôi sẽ tạo một Project và set giá trị ban đầu cho nó với name là “Iphone 7 Plus” và price có giá trị 2000000 (20 triệu). Tiếp theo sẽ set bộ lắng nghe sự kiện trên đối tượng product để lắng nghe sự kiện onChaged (Sự kiện giá thay đổi của sản phẩm).
Và mỗi khi bạn thay đổi giá của sản phẩm thì phương thức onChanged luôn luôn được gọi.
Lời kết
Đến cuối bài này thì tôi hy vọng rằng các bạn có thể hiểu được event trong Java cũng như hiểu được các event của View như onClickListener hay onItemClick của ListView. Nếu các bạn là một người làm UI và thường xuyên phải viết View cho ứng dụng thì kiến thức này các bạn sử dụng rất nhiều trong quá trình làm việc.
ad cho mình hỏi chút nha và mong nhận được câu trả lời sớm từ ad. Theo mình biết thì không thể tạo được đối tượng từ một interface nhưng mình xem bài thì có đoạn làm mình không hiểu:
new OnPriceChanged() {
@Override
public void onChanged(double oldPrice, double newPrice) {
Log.e(TAG, “onChanged: ” + “oldPrice: ” + oldPrice + “, newPrice: ” + newPrice);
}
}
Và mình cũng hay gặp các đoạn code tương tự nhưng mình vẫn không hiểu.
Đúng như bạn đề cập là chúng ta không thể tạo được đối tượng từ interface do interface chỉ là một khuôn mẫu cho các lớp khác implement nó. Nhưng ví dụ trên bạn tạo một interface và có implement các phương thức trong interface thì có thể được bạn nhé, vì nó đã implement các phương thức.
Mình không biết hiểu thế này có đúng không, mình nói sai chỗ nào ad sửa dùm mình nha.
Phương thức setOnPriceChangedListener() nhận vào đối số là một biến tham chiếu có implements một interface. Và:
new OnPriceChanged() {
@Override
public void onChanged(double oldPrice, double newPrice) {
Log.e(TAG, “onChanged: ” + “oldPrice: ” + oldPrice + “, newPrice: ” + newPrice);
}
}
chính là đối tượng vô danh implements interface.
Đúng rồi bạn. Nó chính là một đối tượng vô danh implements các phương thức của interface.
Mình đã hiểu rồi.Cảm ơn ad nhé 😀
Không có gì bạn. Nếu có gì thắc mắc bạn có thể liên hệ với mình qua facebook nhé!
ok. mình có gửi lời mời với ad rồi đó. Có vấn đề mình sẽ nhờ ad giải đáp nhé.