添加监听器vs设置监听器



添加侦听器和设置侦听器的区别是什么

addTextChangedListener(textWatcher);
setOnClickListener(clickListener);

答:

在aioobe的回答之后,我在我的项目中测试了这个。所以我们可以这样做。

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

但是我们不能这样做。(在本例中,它将只设置最后一个侦听器clickListener2)

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

另一个怀疑

我无法想到任何用例中,我需要两个texttwatcher为单个editText。有人能给出这样一个用例吗?

如果您有一个set -方法,通常只有一个侦听器。(不过我个人更喜欢称它们为"处理程序")。

使用add -方法,您通常可以拥有任意数量的侦听器。

他当然是对的。但是有一个额外的考虑:

根据JavaBeans标准

  • getX/isXyzsetXyz定义属性(见PropertyDescriptor)但是
  • addXyzListener, removeXyzListenergetXyzListeners也是事件的标准命名约定听众(见EventSetDescriptor)

所以setXyzListener()不是根据JavaBeans标准设置侦听器的有效方法名!当然,您可以选择故意违反JavaBeans标准,但我试图阻止您无意中这样做:-)

addListener是Java bean标准,setListener是Android标准,两者在不同的上下文中使用。addlistener仅在桌面和web编程中使用,因为在这里我们必须同时处理许多组件。在Android中,使用setListener是因为这里我们有一个activity。在某些情况下,我们使用addListiner像addTextWatcher这是因为在单个活动中,我们必须处理许多EditText。

在我看来,没有很好的理由使用setXxxListener方法而不是addXxxListener。我确信那些"set"方法的存在仅仅是由于程序员的懒惰。这真的很可悲,因为支持一个听众列表并不比支持单个听众难得多。也许你通常只期望有一个感兴趣的听众,但无论如何,有很多很好的理由来支持他们的列表。

我最喜欢的需要侦听器列表的例子是支持调试。您可能希望添加诊断侦听器来监视某些活动,但是如果只使用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.
关于这个问题,我在Android项目问题跟踪器中创建了issue 5711。如果你同意这个问题应该在整个Android SDK中得到解决,请在上面加上你自己的评论。

最新更新