Добавить слушателя и установить прослушиватель

В чем разница между добавлением слушателя и установкой слушателя.

например

addTextChangedListener(textWatcher); setOnClickListener(clickListener); 

Ответ:

После ответа aioobe я протестировал это в своем проекте. Поэтому мы можем это сделать.

 editText.addTextChangedListener(textWatcher1); editText.addTextChangedListener(textWatcher2); 

Но мы не можем этого сделать. (В этом случае будет установлен только последний прослушиватель clickListener2)

 button.setOnClickListener(clickListener1); button.setOnClickListener(clickListener2); 

Еще одно сомнение

Я не могу думать о каком-либо прецеденте, в котором мне нужно два textWatcher для одного editText. Может ли кто-нибудь дать такой прецедент. (Я должен задать этот вопрос как отдельный вопрос?)

Solutions Collecting From Web of "Добавить слушателя и установить прослушиватель"

Если у вас есть set метод, обычно есть только один прослушиватель. (Лично я предпочитаю называть их «обработчиками»).

С помощью add методов вы обычно можете иметь произвольное количество слушателей.

Конечно, aioobe прав. Но есть еще одно соображение:

Согласно стандарту JavaBeans

  • getX / isXyz и setXyz определяют свойства (см. PropertyDescriptor ), но
  • addXyzListener , removeXyzListener и getXyzListeners также являются стандартными соглашениями об именах для EventSetDescriptor событий (см. EventSetDescriptor )

Поэтому setXyzListener() не является допустимым именем метода для установки слушателя в соответствии со стандартом JavaBeans! Конечно, вы можете преднамеренно нарушать стандарт JavaBeans, но я стараюсь не делать этого непреднамеренно 🙂

AddListener является стандартом Java beans, а setListener – стандартом Android, оба используются в разных контекстах. AddListner используется только в случае Desktop и веб-программирования, потому что здесь мы должны иметь дело со многими компонентами. В Android используется setListener, потому что здесь у нас есть одно действие. В какой-то момент мы используем addListiner как addTextWatcher, потому что в одной активности мы имеем дело со многими EditText.

На мой взгляд, нет никакой веской причины для использования методов setXxxListener вместо addXxxListener. Я уверен, что эти «установленные» методы существуют просто из-за ленивости программиста. Это печально, потому что поддержка списка слушателей не намного сложнее, чем поддержка одного слушателя. Возможно, вы обычно ожидаете только одного заинтересованного слушателя, но есть много веских причин для поддержки их списков в любом случае.

Мой любимый пример использования списков слушателей – поддержка отладки. Возможно, вы захотите добавить диагностический прослушиватель для мониторинга какой-либо активности, но только с помощью методов setXxxListener, действие отладки может нарушить ваш код! Суть в том, что при написании наблюдаемого класса вы не хотите делать ненужные предположения о том, как он будет использоваться.

Вот шаблон для некоторого наблюдаемого класса под названием MyModel:

 public interface MyModelChangeListener { public void changed(MyModel model); } private ArrayList<MyModeChangeListener> listeners = new ArrayList<MyModeChangeListener>(); public void addMyModeChangeListener(MyModeChangeListener tcl) { listeners.add(tcl); } public void removeMyModeChangeListener(MyModeChangeListener tcl) { listeners.remove(tcl); } protected void fireMyModeChange() { for(MyModeChangeListener mmcl : listeners) mmcl.changed(this); } 

Заинтересованные стороны добавляют слушателей по мере необходимости, а реализация MyModel и любые подклассы просто вызывают

 fireMyModeChange(this) whenever their observable states change. 

Я создал issue 5711 в трее о проблеме с проектом Android об этой проблеме. Пожалуйста, запустите его и, возможно, добавьте свои собственные комментарии там, если вы согласитесь, что это должно быть исправлено во всем Android SDK.