EventBus架構在Android多Pane(Fragment)中的應用

來源:互聯網
上載者:User

標籤:

通常多pane的設計中,比如Fragment A是個Headline,Fragement B是detail,那麼B通常需要實現A的點擊事件的介面,這樣子的話,兩個fragment就高耦合了,而且需要在Fragment A中編寫一個interface,如果Fragment很多,情景更複雜些,就亂了。 這裡可以使用 EventBus這個架構,一個典型的發行者-訂閱者模式。具體可以參考:https://github.com/greenrobot/EventBus 使用方法大致如下: 這個例子來源於Android Developers的一個典型的多Fragment的例子,左邊Fragment是HeadlineFragment,含有很多標題的listview,右邊是DetailFragment,點擊左邊Fragment中一項會重新整理右邊的Fragment。 a. 首先定義自己的Event,這裡其實是隨便寫個類,例子中Headline需傳一個點擊時候的listview的position給Detail fragment,所以可以寫個封裝int類型的MessageEvent:
public class MessageEvent {    public int position;    public MessageEvent(int position) {        this.position = position;    }}
b.  在訂閱者(即Detail fragment或者說fragment B)中,onstart和onstop要註冊/解註冊:
//DetailFragment.java

@Overridepublic void onStart() { super.onStart();; EventBus.getDefault().register(this);}@Overridepublic void onStart() { super.onStart(); setNewsCategory(0); EventBus.getDefault().register(this);}
c. 在訂閱者(即Detail fragment或者說fragment B)中,寫一個名字叫onEvent的函數,帶回來的參數是MessageEvent類型,這個函數即被調用的方法,等待Headline傳過來封裝了position資料的MessageEvent對象
//DetailFragment.java
public void onEvent(MessageEvent event){    int index = event.positioin;   // do something using index,比如重新整理文章內容}
d. 在發行者(即Headline Fragment或者說Fragment A)中,在合適的地方執行post方法,即發布出去這個MessageEvent,這裡即在HeadLineFragment的listview被點擊的回調中發送post:
//HeadLineFragment.java

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
  EventBus.getDefault().post(new MessageEvent(position));}

這樣子,DetailFragment的onEvent方法就會被調用,含有position的MessageEvent也就被傳了過去,隨之DetailFragment根據拿到的position來重新整理介面。

 大功告成,這裡可以發現兩個fragment沒有寫任何的interface也沒implements任何的介面,也不用執行個體化一個listenser並且執行所謂的setonlistener。這裡的內部流程大致是,EventBus在某個組件中註冊的時候回記錄下這個組件裡面的onEvent函數,一個應用中可能有多個onEvent函數等待被調用,這裡即通過onEvent函數的參數類型和個數來區別。 使用時需要注意一個問題,這裡EventBus是通過java反射機制來找到這個onEvent方法的,所以打包的時候若需要混淆的話千萬記住不要混淆onEvent這個函數,可以在proguard檔案中添加:
-keepclassmembers class ** {    public void onEvent*(**);}
 關於EventBus更多使用方法以及源碼可以參考https://github.com/greenrobot/EventBus/blob/master/HOWTO.md

EventBus架構在Android多Pane(Fragment)中的應用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.