Это более общий ответ для людей, которые приходят сюда, просто желая сделать слушателя. Я суммирую Создание пользовательских слушателей из CodePath. Прочтите эту статью, если вам нужно больше объяснений.
Вот шаги.
1. Определить интерфейс
Это дочерний класс, которому нужно общаться с неизвестным родителем.
public class MyClass {
// interface
public interface MyClassListener {
// add whatever methods you need here
public void onSomeEvent(String title);
}
}
2. Создать установщик слушателя
Добавьте личную переменную-член слушателя и метод открытого сеттера в дочерний класс.
public class MyClass {
// add a private listener variable
private MyClassListener mListener = null;
// provide a way for another class to set the listener
public void setMyClassListener(MyClassListener listener) {
this.mListener = listener;
}
// interface from Step 1
public interface MyClassListener {
public void onSomeEvent(String title);
}
}
3. События прослушивателя триггера
Дочерний объект теперь может вызывать методы в интерфейсе слушателя. Обязательно проверьте на ноль, потому что там может не быть никого, кто слушает. (То есть родительский класс, возможно, не вызвал метод setter для нашего слушателя.)
public class MyClass {
public void someMethod() {
// ...
// use the listener in your code to fire some event
if (mListener != null)
mListener.onSomeEvent("hello");
}
// items from Steps 1 and 2
private MyClassListener mListener = null;
public void setMyClassListener(MyClassListener listener) {
this.mListener = listener;
}
public interface MyClassListener {
public void onSomeEvent(String myString);
}
}
4. Реализация обратных вызовов слушателя в родительском
Теперь родитель может использовать прослушиватель, который мы установили в дочернем классе.
Пример 1
public class MyParentClass {
private void someMethod() {
MyClass object = new MyClass();
object.setMyClassListener(new MyClass.MyClassListener() {
@Override
public void onSomeEvent(String myString) {
// handle event
}
});
}
}
Пример 2
public class MyParentClass implements MyClass.MyClassListener {
public MyParentClass() {
MyClass object = new MyClass();
object.setMyClassListener(this);
}
@Override
public void onSomeEvent(String myString) {
// handle event
}
}