在安卓中如何给视图添加多个监听器?

35

在安卓中,是否可以给多个按钮附加 onClick 监听器? 例如:

btn1.setOnClickListener(listener1);
btn1.setOnCliclListener(listener2);

当按钮被点击时,listener1listener2的onClick事件都会被触发吗?

在普通的GUI应用程序中,我知道我们可以为一个事件附加多个事件处理程序。在Android中是否也可以这样做或者存在任何限制?

敬礼, Lalith

6个回答

50

通常情况下,Android仅支持一个已注册的监听器。但是,您可以使用组合模式轻松创建一个监听器,该监听器只是将事件转发到其他监听器。


2
请问您有这方面的参考资料吗? - Lalith
2
@Lalith:组合模式是一种经典的设计模式:http://en.wikipedia.org/wiki/Composite_pattern - CommonsWare
嗯...我需要为单个事件添加多个事件处理程序的主要原因是,我计划创建一个库,供其他Android开发人员使用。它应该在某个地方初始化,并自动将所需的事件处理程序附加到每个View项上。我在Silverlight中很容易做到这一点,所以想知道是否可能在Android中实现。 - Lalith
@Lalith:是的,这是可能的。 - CommonsWare
3
好的,我会尽力以最简洁明了的方式翻译以下内容:作为示例:https://dev59.com/dW035IYBdhLWcg3wW-z1 - Dan Is Fiddling By Firelight
显示剩余3条评论

4
如果有人遇到类似问题,可以尝试以下方法:
private void setClickListeners(View view, List<View.OnClickListener> clickListeners){
    view.setOnClickListener(v -> {
        for(View.OnClickListener listener: clickListeners){
            listener.onClick(v);
        }
    });
}

1
一种简单的实现方法是直接这样做:

btn1.setOnClickListener(new View.OnClickListener(){
 @Override
 public void onClick(View v) {  
   listener1.onClick(v);
   listener2.onClick(v);
}})

在您的listener1定义中调用listener2.onClick(v)。

0

这是我将在 Kotlin 中做的事情:

arrayListOf(
        view1,
        view2,
        view3
    ).forEach { it.setOnClickListener { /*do stuff here*/ } }

非常易读,且可以避免复制粘贴错误。

-1
public void onClick(View v) {
    if(v.getId() == R.id.button1) {
        // do this
    }else if(v.getId() == R.id.button2) {
        // do that
    }
}

OP的问题是一个按钮需要两个监听器。 - João Miranda

-5

不是这样的,例如只需这样做:

设置监听器:

btn.setOnClickListener(this);

实现方法:

public void Onclick(View arg0){

   // check your id and do what you want
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接