添加侦听器和设置侦听器之间有什么区别。
e.g。
addTextChangedListener(textWatcher);
setOnClickListener(clickListener);
答案:
在aioobe回答之后,我在我的项目中对此进行了测试。 所以我们可以这样做。
editText.addTextChangedListener(textWatcher1);
editText.addTextChangedListener(textWatcher2);
但是我们不能这样做。(在这种情况下,它只设置最后一个监听器clickListener2)
button.setOnClickListener(clickListener1);
button.setOnClickListener(clickListener2);
另一个疑问
我无法想到任何需要两个textWatcher用于单个editText的用例。任何人都可以提供这样的用例。 (我应该将这个问题作为单独的问题提出来吗?)
答案 0 :(得分:18)
如果你有set
- 方法,通常只有一个监听器。 (我个人更喜欢称他们为“处理程序”)。
使用add
- 方法,您通常可以拥有任意数量的侦听器。
答案 1 :(得分:1)
根据JavaBeans标准
getX
/ isXyz
和setXyz
定义
属性(见
PropertyDescriptor
)但addXyzListener
,removeXyzListener
而getXyzListeners
也是
Event的标准命名约定
听众(见
EventSetDescriptor
)因此setXyzListener()
不是根据JavaBeans标准设置侦听器的有效方法名称!当然,您可能会选择故意违反JavaBeans标准,但我试图阻止您无意中执行此操作: - )
答案 2 :(得分:0)
在我看来,没有充分的理由使用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.
我在Android项目问题跟踪器中创建了issue 5711
有关此问题的信息。如果您同意在整个Android SDK中修复此问题,请为其加注星标并在那里添加您自己的评论。
答案 3 :(得分:0)
addListener是Java bean标准,setListener是Android标准,两者都在不同的上下文中使用。 addListner仅用于桌面和Web编程,因为这里我们必须完全处理许多组件。在Android中,使用了setListener,因为这里我们有一个活动。在某些方面,我们使用像addTextWatcher这样的addListiner,因为在单个活动中我们必须处理许多EditText。