如何为一个事件设置多个侦听器?

时间:2011-03-28 21:19:31

标签: android composite

我想为一个事件设置多个侦听器,并且发现使用复合侦听器是关键。

有人能举个例子吗?

3 个答案:

答案 0 :(得分:45)

class CompositeListener implements OnEventListener {
   private List<OnEventListener> registeredListeners = new ArrayList<OnEventListener>();

   public void registerListener (OnEventListener listener) {
      registeredListeners.add(listener);
   }

   public void onEvent(Event e) {
      for(OnEventListener listener:registeredListeners) {
         listener.onEvent(e);
      }
   }
}

.....

CompositeListener composite = new CompositeListener();
composite.registerListener(listener1);
composite.registerListener(listener2);
component.setOnEventListener(composite);

答案 1 :(得分:5)

你可以试试这个黑客 你需要扩展视图,例如扩展Button以接受多个onclick侦听器。 您创建一个实现OnclickListener

的内部类
private class OnclickListenerCollection implements OnClickListener{
    private ArrayList<OnClickListener> listeners;

    public void addOnclickListener(OnClickListener listener){
        listeners.add(listener);
    }

    @Override
    public void onClick(View v) {
        for(OnClickListener l : listeners){
            l.onClick(v);
        }

    }
}

在你的子类按钮的构造函数中,你调用super.setOnclickListener传递你内部类的实例

private OnclickListenerCollection listenerCollector;

在您的构造函数中:

listenerCollector = new OnclickListenerCollection();
super.setOnClickListener(listenerCollector);

重写setOnclickListener方法,将侦听器添加到集合

@Override
public void setOnClickListener(OnClickListener l) {

    listenerCollector.addOnclickListener(l);
}

我没有尝试过,但我相信它会起作用

答案 2 :(得分:1)

我知道它已经晚了几年,但是想要添加我刚刚上班几个小时的版本。以下是DBupdateEventListener.java文件中的代码:

public interface DBupdateEventListener {
    public void onUpdateChannelSubscriptions();
}
class DBupdateEventListenerRegistry implements DBupdateEventListener{
    public static List<DBupdateEventListener> registeredListeners = new ArrayList<DBupdateEventListener>();
    public void registerListener(DBupdateEventListener listener){
        registeredListeners.add(listener);
    }
    public void onUpdateChannelSubscriptions(){
        for (DBupdateEventListener listener:registeredListeners){
            listener.onUpdateChannelSubscriptions();
        }
    }
}

registerListeners是一个公共静态变量非常重要。这就是我在关闭这个问题几年后我自己回答这个问题的全部原因。

这是我在片段的OnCreate()方法中使用的代码,需要在触发事件后进行更新:

        dbUpdater = new DBupdateEventListener() {
            @Override
            public void onUpdateChannelSubscriptions() {
                //put the code you want to run when the event is triggered here:
                loadChannelListsFromDB();
            }
        };
        DBupdateEventListenerRegistry temp = new DBupdateEventListenerRegistry();
        temp.registerListener(dbUpdater);

以下是我的异步任务中使用的代码,它首先触发事件:

dbUpdaterRegistry = new DBupdateEventListenerRegistry();
dbUpdaterRegistry.onUpdateChannelSubscriptions();