【发布时间】:2011-03-28 21:19:31
【问题描述】:
我想为一个事件设置多个监听器,发现使用复合监听器是关键。
谁能给我一个例子?
【问题讨论】:
我想为一个事件设置多个监听器,发现使用复合监听器是关键。
谁能给我一个例子?
【问题讨论】:
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);
【讨论】:
你可以试试这个技巧 您将需要扩展视图,例如扩展 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);
}
我没有尝试过,但我相信它会起作用
【讨论】:
setOnClickListener 的含义。如果改为实现两个名称说明其功能的方法,则含义会更清楚:addOnClickListener 和 removeOnClickListener。
我知道这已经晚了几年,但想添加我刚刚花了几个小时上班的版本。这是位于文件 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();
}
}
}
registeredListeners 是一个公共静态变量是非常重要的。这就是我在这个问题已经关闭几年后添加自己的答案的全部原因。
这是我在事件触发后需要更新的片段的 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();
【讨论】:
registeredListeners 仅需要为 static,前提是它不是已知对象上的字段,只要需要,它就会一直存在。 static 的一个缺点是,只要您的应用程序还活着,它就会一直存在。虽然有时这很好,但它不是您想要养成使用习惯的“食谱”。 static 的第二个缺点是现在您不能创建该类的两个实例,每个实例都有自己的一组侦听器。相反,在活动/片段中,有一个 字段 DBupdateEventListenerRegistry eventRegistry;,用于该活动的侦听器。