添加侦听器与set侦听器

时间:2011-05-02 08:30:23

标签: java android

添加侦听器和设置侦听器之间有什么区别。

e.g。

addTextChangedListener(textWatcher);
setOnClickListener(clickListener);

答案:

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

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

但是我们不能这样做。(在这种情况下,它只设置最后一个监听器clickListener2)

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

另一个疑问

我无法想到任何需要两个textWatcher用于单个editText的用例。任何人都可以提供这样的用例。 (我应该将这个问题作为单独的问题提出来吗?)

4 个答案:

答案 0 :(得分:18)

如果你有set - 方法,通常只有一个监听器。 (我个人更喜欢称他们为“处理程序”)。

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

答案 1 :(得分:1)

当然,aioobe是对的。但还有一个额外的考虑因素:

根据JavaBeans标准

  • getX / isXyzsetXyz定义 属性(见 PropertyDescriptor)但
  • addXyzListenerremoveXyzListenergetXyzListeners也是 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。