2011-03-28 122 views

回答

40
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); 
+4

您可能想要添加一個remove方法,因爲它也是該模式的一部分。 – Swanand 2012-05-23 07:25:15

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); 
} 

我還沒有嘗試過,但我相信它會工作

+5

我不會稱之爲黑客。 – 2013-11-04 15:46:26

+0

這是個好主意。恕我直言,它可以改善一個小小的變化。如上所述,它改變了'setOnClickListener'的含義。如果改爲實現兩個名稱分別爲「addOnClickListener」和「removeOnClickListener」的方法,含義會更清晰。 – ToolmakerSteve 2016-10-20 19:20:24

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(); 
     } 
    } 
} 

這是非常非常重要的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(); 
+0

只有在需要的時候,'registeredListeners'只需要是靜態的,如果它不是一個已知的對象上的字段。靜態的一個缺點是現在只要你的應用程序還活着,它就會停留。雖然有時候這很好,但這並不是你想要習慣使用的「配方」。 「靜態」的第二個缺點是現在你不能創建類的兩個實例**,每個實例都有自己的一組監聽器。相反,在活動/片段中,爲該活動的偵聽器提供**字段**'DBupdateEventListenerRegistry eventRegistry;'。 – ToolmakerSteve 2016-10-20 19:37:45