添加监听器与设置监听器

添加侦听器和设置侦听器有什么区别?

例如

addTextChangedListener(textWatcher); setOnClickListener(clickListener); 

回答:

在aioobe的回答后,我已经在我的项目中testing了这个。 所以我们可以做到这一点。

 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 / isXyzsetXyz定义属性(请参阅PropertyDescriptor
  • addXyzListenerremoveXyzListenergetXyzListeners也是事件监听器的标准命名约定(请参阅EventSetDescriptor

所以setXyzListener()不是一个有效的方法名来设置一个监听器根据JavaBeans标准! 当然,你可能会故意select违反JavaBeans标准,但是我试图阻止你无意中做到这一点:-)

在我看来,没有什么好的理由让setXxxListener方法代替addXxxListener。 我确信这些“设定”方法只是因为程序员的懒惰而存在。 真的很伤心,因为支持一个听众名单并不比支持一个单一的听众困难得多。 通常你只希望有一个感兴趣的听众,但是有很多好的理由来支持他们的名单。

我最喜欢的需要侦听器列表的例子是支持debugging。 您可能想要添加一个诊断监听器来监视某个活动,但只有setXxxListener方法,debugging行为可能会破坏您的代码! 底线是,在编写一个可观察的类时,你不想对它将如何使用做出不必要的假设。

以下是一些名为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. 

我在Android项目问题跟踪器中创build了有关此问题的issue 5711 。 如果您认同这个问题,请在整个Android SDK中修复这个问题。

addListener是Java bean标准,而setListener是Android标准,两者都在不同的上下文中使用。 只有在桌面和networking编程的情况下才使用addListner,因为这里我们必须完全处理很多组件。 在Android中,使用setListener是因为在这里我们有一个活动。 在某些方面,我们使用addListiner像addTextWatcher这是因为在单个活动中,我们必须处理许多EditText。