歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

EventBus框架在Android多Pane(Fragment)中的使用實例

通常多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

@Override
public void onStart() {
    super.onStart();;
    EventBus.getDefault().register(this);
}

@Override
public 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

更多Android相關信息見Android 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=11

Copyright © Linux教程網 All Rights Reserved