添加侦听器和设置侦听器的区别是什么
。
addTextChangedListener(textWatcher);
setOnClickListener(clickListener);
答:
在aioobe的回答之后,我在我的项目中测试了这个。所以我们可以这样做。
editText.addTextChangedListener(textWatcher1);
editText.addTextChangedListener(textWatcher2);
但是我们不能这样做。(在本例中,它将只设置最后一个侦听器clickListener2)
button.setOnClickListener(clickListener1);
button.setOnClickListener(clickListener2);
另一个怀疑
我无法想到任何用例中,我需要两个texttwatcher为单个editText。有人能给出这样一个用例吗?
如果您有一个set
-方法,通常只有一个侦听器。(不过我个人更喜欢称它们为"处理程序")。
使用add
-方法,您通常可以拥有任意数量的侦听器。
他当然是对的。但是有一个额外的考虑:
根据JavaBeans标准
-
getX
/isXyz
和setXyz
定义属性(见PropertyDescriptor
)但是 -
addXyzListener
,removeXyzListener
和getXyzListeners
也是事件的标准命名约定听众(见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中得到解决,请在上面加上你自己的评论。