[Android] Hướng dẫn tạo Custom Listeners trong Android

Đăng bởi: Admin | Lượt xem: 1548 | Chuyên mục: Android

Listeners là một thành phần quan trong việc phát triển ứng dụng Android, thường được sử dụng để thực thi code khi có event xảy ra.. Chúng là một cách thức phổ biến để tạo các asynchronous callbacks. Cùng tìm hiểu cách để tạo một Custom Listener của riêng bạn trong bài viết này nhé!


1. Mở đầu

Một cách sử dụng phổ biến của Listeners mà bạn có thể đã gặp, nếu bạn có một chút kinh nghiệm trong việc phát triển ứng dụng Android, là built-in onClickListener  của một button. Chúng ta thường set onClickListener  cho một button, với một đoạn code sẽ chạy khi button được clicked, đây là event trong trường hợp này. Trong Java, nó thường trông như thế này:

Button button = findViewById(R.id.example);
button.setOnClickListener(new View.OnClickListener(){
    @Override
    public void onClick(View view) {
        //Do some work here
    }
});

Nhưng bên cạnh những gì tôi đã mô tả ở trên, chúng ta có thể tạo ra những custom listeners của mình với các callbacks được đính kèm với các events được kích hoạt từ các khu vực nhất định trong code của chúng ta.

Nhưng tại sao?

Dưới đây là một số trường hợp mà chúng ta có thể cần phải tạo một custom listeners:

  • Khi chúng ta cần phát ra một event từ một fragment đến một activity
  • Khi chúng ta cần phát ra một event từ adapter tới một fragment hoặc activity

Nói chung, một listener rất hữu ích khi bạn có một “child object” và một “parent object” hoặc handler, trong đó một parent object là một object tạo ra một new instance của child object. Và chúng ta có một số công việc cần phải được thực hiện trong parent object, nhưng cũng chỉ cần được thực hiện khi một event nào đó xảy ra trong child object. Vì vậy, chúng ta phải tìm cách truyền đạt thực tế rằng event đang được đề cập xảy ra trong child object, đến parent object.

2. Làm thế nào để tạo một custom listener?

Bước 1:

Đầu tiên, định nghĩa một interface trong child object (adapter, fragment, POJO, ....). Rồi định nghĩa event sẽ xảy ra ảnh hưởng đến parent. Những event đó sẽ được đại diện bởi các methods trong interface. Một ví dụ trong Java:

public interface CustomListener{
    void onDataReady(Data data);
    void onSubmitForm();
}

Trong ví dụ trên, onDataReady(Data data) và onSubmitForm() là các method signatures/callbacks được đại diện cho các event mà có thể xảy ra trong child object.

Bước 2:

Tiếp theo, thiết lập một biến listener để lưu một triển khai cụ thể của các callbacks trong interface của chúng ta. Việc implement các callbacks sẽ được định nghĩa bởi parent object. Vì vậy, bên trong child class, bạn có thể tạo biến cũng như phương thức setter công khai cho hàm listener callbacks để định nghĩa từ parent, như sau:

private CustomListener mListener;
public void setCustomListener(CustomListener listener){
    mListener = listener;
}

Bạn không nhất thiết cần phải sử dụng phương thức setter, vì có một số phương thức để truyền listener callback vào child object, chẳng hạn như truyền nó qua constructor hoặc truyền qua lifecycle event (như onAttach() event của fragment khi xử lý với giao tiếp activity/fragment)

Bước 3:

Bây giờ, chúng ta đã tạo xong biến listener, chúng ta có thể implement interface trong parent class, override các phương thức, và cho code xử lý event vào trong các phương thức đó, sau đó set listener implementation trên child object.

public class Parent implements Child.CustomListener{
//Some code
...
@Override
    public void onDataReady(Data data){
        //some fancy implementation
    }
@Override
public void onSubmitForm(){
       //code we want to run when this event occurs
    }
childObject.setCustomListener(this);
}

Trên đây là một cách rất phổ biến để tạo ra một implementation của listener trong parent class. Một cách khác để làm điều tương tự mà chúng ta đã làm ở trên là tạo một thể hiện của custom listener bên trong parent class (thay vì làm cho parent class tự implement the interface) và đặt cài đặt đó làm custom listener cho child object của chúng ta, như vậy :

Child childObject = new Child();
Child.CustomListener listener = new Child.CustomListener(){
    @Override
    public void onDataReady(Data data){
        //some fancy implementation
    }
    public void onSubmitForm(){
       //code we want to run when this event occurs
    }
}
childObject.setCustomListener(listener);

Bước 4:

Bây giờ, child object có thể truyền event tới parent sử dụng listener, khi chúng xảy ra, ta có thể truyền data bất kỳ tới parent object. Ví dụ, trong child object:

//The event "onDataReady" has occurred in the child object and we 
//fire up the event to the parent using the listener 
public void OnSuccess(Response response){
    Data data = response.getData;
    listener.onDataReady(data);
}

3. Kết luận

Vậy là chúng ta đã hoàn tất việc cài đặt custom listener! Hy vọng bạn có thể sử dụng các custom listener cho các dự án sau này, hoặc ít nhất có thêm một số kiến thức mới.

Cảm ơn bạn đã đọc bài viết.

Chào thân ái và quyết thắng!

Nguồn tham khảo: https://levelup.gitconnected.com/custom-listeners-in-android-89ebdefe3e99

vncoder logo

Theo dõi VnCoder trên Facebook, để cập nhật những bài viết, tin tức và khoá học mới nhất!



Khóa học liên quan

Khóa học: Android

Học Kotlin cơ bản
Số bài học:
Lượt xem: 17076
Đăng bởi: Admin
Chuyên mục: Android

Học lập trình Flutter cơ bản
Số bài học:
Lượt xem: 55126
Đăng bởi: Admin
Chuyên mục: Android

Lập trình Android cơ bản
Số bài học:
Lượt xem: 22194
Đăng bởi: Admin
Chuyên mục: Android