Прикрепление нескольких слушателей к представлениям в Android?

Можно ли прикрепить несколько прослушивателей onClick к кнопкам в Android? Пример:

btn1.setOnClickListener(listener1);
btn1.setOnCliclListener(listener2);

И когда нажимается кнопка onClick, запускается событие listener1 и listener2?

Я знаю, что в обычных приложениях с графическим интерфейсом мы можем прикрепить к событию более одного обработчика событий. Можно ли и для андроида или есть какие-то ограничения?

С уважением, Лалит


person Lalith    schedule 27.12.2010    source источник


Ответы (5)


В целом Android поддерживает только одного зарегистрированного слушателя. Однако вы можете легко создать прослушиватель, который просто пересылает события другим прослушивателям, используя составной шаблон.

person CommonsWare    schedule 27.12.2010
comment
Не могли бы вы сообщить мне какие-либо ссылки для этого? - person Lalith; 28.12.2010
comment
@Lalith: составной шаблон — это классический шаблон проектирования: en.wikipedia.org/wiki/Composite_pattern - person CommonsWare; 28.12.2010
comment
Хм ... основная причина, по которой мне нужно несколько обработчиков событий для одного события, заключается в том, что я планирую создать библиотеку, которая будет использоваться другими разработчиками Android. Предполагается, что он где-то инициализируется, и он сам по себе прикрепляет необходимые обработчики событий к каждому элементу View. Я легко сделал это в Silverlight, поэтому мне было интересно, возможно ли это. - person Lalith; 28.12.2010
comment
@Лалит: Да, это возможно. - person CommonsWare; 28.12.2010
comment
Понятно! но не уверен, смогу ли я следовать этому подходу. Спасибо, в любом случае ! - person Lalith; 28.12.2010
comment
Пример того, как это сделать: stackoverflow.com/questions/5465204/ - person Dan Is Fiddling By Firelight; 09.01.2013
comment
@Lalith, я тоже делаю то же самое, так что не могли бы вы дать мне больше информации о реализации. Как вы это реализовали? - person Suresh; 20.04.2020
comment
Джон Камау приводит пример кода для этого ниже. Но, вероятно, лучше иметь только один onClickListener, который вызывает несколько функций. - person Nick; 23.10.2020

Если кто-то столкнется с похожей проблемой, попробуйте следующее:

private void setClickListeners(View view, List<View.OnClickListener> clickListeners){
    view.setOnClickListener(v -> {
        for(View.OnClickListener listener: clickListeners){
            listener.onClick(v);
        }
    });
}
person John Kamau    schedule 22.10.2020

Простым способом добиться этого было бы просто сделать:

btn1.setOnClickListener(new View.OnClickListener(){
 @Override
 public void onClick(View v) {  
   listener1.onClick(v);
   listener2.onClick(v);
}})

Или вызовите listener2.onClick(v) внутри определения вашего listener1

person Tom    schedule 15.07.2021

Нет, например, просто сделайте так:

Установить слушателя:

btn.setOnClickListener(this);

Метод реализации:

public void Onclick(View arg0){

   // check your id and do what you want
}
person Tsunaze    schedule 27.12.2010

person    schedule
comment
Вопрос ОП был два слушателя для одной кнопки - person João Miranda; 21.08.2020