回答
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);
}
我還沒有嘗試過,但我相信它會工作
我不會稱之爲黑客。 – 2013-11-04 15:46:26
這是個好主意。恕我直言,它可以改善一個小小的變化。如上所述,它改變了'setOnClickListener'的含義。如果改爲實現兩個名稱分別爲「addOnClickListener」和「removeOnClickListener」的方法,含義會更清晰。 – ToolmakerSteve 2016-10-20 19:20:24
我知道這是好幾年晚,但想補充我的版本,我只花了幾個小時才上班。這裏是位於文件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'只需要是靜態的,如果它不是一個已知的對象上的字段。靜態的一個缺點是現在只要你的應用程序還活着,它就會停留。雖然有時候這很好,但這並不是你想要習慣使用的「配方」。 「靜態」的第二個缺點是現在你不能創建類的兩個實例**,每個實例都有自己的一組監聽器。相反,在活動/片段中,爲該活動的偵聽器提供**字段**'DBupdateEventListenerRegistry eventRegistry;'。 – ToolmakerSteve 2016-10-20 19:37:45
- 1. 將一個事件偵聽器更改爲另一個事件偵聽器?
- 2. javascript中的多個事件偵聽器
- 3. 在android中爲每個textview分別設置事件偵聽器
- 4. 如何將選項卡偵聽器設置爲一個ActionBar
- 5. 設置自定義事件偵聽器
- 6. jQuery的 - 爲同一按鈕多個事件偵聽器
- 7. 如何爲所有事件添加一個偵聽器?
- 8. 如何在Symfony 2中爲form.set_data事件設置偵聽器?
- 9. 如何設置偵聽器?
- 10. 將多個事件偵聽器添加到一個元素
- 11. 如何爲反應中的兩個或多個事件添加一個事件偵聽器
- 12. 如何計算有多少個偵聽器掛鉤到事件?
- 13. 如何將事件偵聽器添加到多個項目?
- 14. 事件偵聽器
- 15. 如何爲所有按鈕註冊單個事件偵聽器
- 16. 如何在另一個類的活動中設置偵聽器?
- 17. 如何設置另一個類的偵聽器?
- 18. jQuery:一次創建多個事件偵聽器?
- 19. 如何在Hibernate 4實體上設置事件偵聽器?
- 20. 如何在Firebase值事件上設置偵聽器?
- 21. 創建一個刪除事件偵聽器,並添加事件偵聽器這個功能
- 22. 將事件偵聽器傳遞給事件偵聽器?
- 23. 我可以將一個hashChange偵聽器設置爲iFrame src嗎?
- 24. 線程正在偵聽一個事件
- 25. gevent多個StreamServer偵聽器
- 26. 是否有必要爲chrome擴展設置事件偵聽器
- 27. 如何爲微調器默認項目設置事件偵聽器?
- 28. 如何爲更新和保存配置NHIbernate事件偵聽器?
- 29. 使用單個事件橋接兩個事件偵聽器
- 30. 如何添加一個jQuery偵聽器?
您可能想要添加一個remove方法,因爲它也是該模式的一部分。 – Swanand 2012-05-23 07:25:15