2014-01-22 21 views
0

我有一個片段,它擴展DialogFragment並需要通知其他對象時,其內容的變化。什麼是最好的方式添加偵聽器到我的片段

android片段指南指出,最好的方法是要求包含活動實現指定的接口,然後將活動轉換到該接口並調用該方法。

這是行得通的,但它的侷限性是隻有包含活動才能聽取更改。如果我想要通知任意對象,我該怎麼辦?

我不能只是採取一種方法,採取一個聽衆作爲參數,因爲片段可能會重新由Android構建在我的背後。我不能將監聽器放在一個包中,因爲我無法知道類是否實現了可以持久化/序列化的監聽器,並且我並不是所有的監聽器對象都是重複的。

我的片段在彈出的同時使用,並且作爲在主視圖中顯示正常片段

+0

爲什麼不使用上面提到的接口方法,並在活動中發送廣播以通知誰想要收聽廣播? – Mikel

+0

這可能會起作用,但會導致片段與活動之間的緊密耦合。我不希望我的片段在包含我的片段的所有活動中都需要特殊的廣播代碼。 – MTilsted

回答

1

你應該嘗試EventBus library。基本上你可以從任何地方註冊一個事件並從任何地方發送事件。事件是普通的Pojos,它可以包含任何變量或其他對象。 這使得活動,碎片等之間的整個通信變得更加容易。

+0

我會看看它。但它似乎是一個繁重的解決方案,需要大量的代碼才能進行1:1通信。 – MTilsted

+0

它確實只需要很少的代碼。幾條線,你很好。 – FWeigl

+0

這還不止於我希望它需要的單行。但是我猜想幾條線並不是那麼糟糕。我的問題的根本原因是,原來的「開發人員」將整個應用程序編寫爲單個活動。 – MTilsted

1

另一種事件總線解決方案是使用Square的Otto

或者你可以嘗試LocalBroadcastManager

+0

不幸的是LocalBroadcastManager只能通過support-v4兼容庫使用。 –

0

製作和界面,suports回調,例如:

interface IListener{ 
    public void onEventRaised(object arguments); 
} 

然後使靜態類別,其中包含偵聽器列表,並在您提出事件時調用它們,例如:

public static class AppListenerDispatcher{ 
     private static List<IListener> listeners; //make add and remove methods 

     public static void raiseMyEvent(object arguments){ 
      for (IListener listener: listeners) 
      listener.onEventRaised(arguments); 
     } 
    } 

現在,您只需要在將監聽此事件並將其添加到列表中的coresponding類中實現此接口。然後,您可以隨時撥打AppListenerDispatcher.raiseMyEvent(arguments),列表中的所有聽衆都將執行相應的工作。

相關問題