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

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

например.

addTextChangedListener(textWatcher);
setOnClickListener(clickListener);

Ответ:

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

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

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

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

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

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

Ответ 1

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

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

Ответ 2

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

В соответствии со стандартом JavaBeans

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

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

Ответ 3

По моему мнению, нет веских оснований для использования методов 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 SDK.

Ответ 4

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