Java 添加侦听器与设置侦听器

Java 添加侦听器与设置侦听器,java,android,Java,Android,添加侦听器和设置侦听器之间的区别是什么 e、 g 回答: 在aioobe的回答之后,我在我的项目中对此进行了测试。 所以我们可以这样做 editText.addTextChangedListener(textWatcher1); editText.addTextChangedListener(textWatcher2); 但我们不能这样做。(在本例中,它将只设置最后一个侦听器clickListener2) 另一个疑问 我想不出任何一个需要两个textWatcher来处理单个editText的用

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

e、 g

回答:

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

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

另一个疑问


我想不出任何一个需要两个textWatcher来处理单个editText的用例。谁能给出这样一个用例呢。(我应该单独问这个问题吗?

如果你有一套
方法,通常只有一个侦听器。(但就我个人而言,我更喜欢称他们为“经理人”)


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

aioobe当然是正确的。但还有一个额外的考虑:

根据JavaBeans标准

  • getX
    /
    isXyz
    setXyz
    定义 属性(参见 )但是
  • addXyzListener
    removeXyzListener
    getXyzListeners
    也是 事件的标准命名约定 听众(见 )

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

在我看来,使用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); }

我在Android项目问题跟踪器中创建了这个问题。如果您同意在整个Android SDK中解决此问题,请在此处添加您自己的注释。

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

@aioobe所以你的意思是我只能设置一个clickListener,但在我的示例中,我可以向单个视图添加多个textWatcher。是的。考虑到方法名称,这将是我的解释。您应该仔细阅读API文档以确定。@aioobe您可以给出仅设置一个侦听器和添加多个侦听器的示例吗?如果使用
set
方法,则将侦听器设置为作为参数提供的侦听器(随后调用
set
方法将覆盖以前设置的侦听器)。如果使用
add
方法,可以反复调用该方法,并且会添加越来越多的侦听器。
button.setOnClickListener(clickListener1);
button.setOnClickListener(clickListener2);
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); }
fireMyModeChange(this) whenever their observable states change.