1. 程式人生 > >EventBus 3.0實現Activity和fragment通訊、fragment和fragment通訊

EventBus 3.0實現Activity和fragment通訊、fragment和fragment通訊

注意:說兩個坑
1.activity和Fragment通過eventbus通訊,兩個類必須都regist和unregist,unregist最好放到onpause方法中,要不容易出異常。
2.兩個類中必須有最少一個接受方法,如果一個也沒有也容易出異常。

  • 首先在gradle(app)中新增依賴
  compile 'org.greenrobot:eventbus:3.0.0'
  • 例項說明:
    MainActivity中有兩個fragment
    1.點選fragment1中的按鈕後,跳轉到fragment2,這個過程由fragment1給MainActivity發訊息處理,完成fragment和Activity之間的通訊
    2.點選fragment2中的按鈕,跳轉回fragment1,並將fragment2中的資訊告訴fragment1。這個過程包括fragment2給MainActivity發訊息做跳轉,fragment2給fragment1發訊息實體。完成fragment和Activity之間、fragment2和fragment1之間的通訊。

看下效果
這裡寫圖片描述
1.MainACtivity

MainActivity中註冊和取消註冊程式碼


    @Override
    protected void onResume() {
        super.onResume();
        EventBus.getDefault().register(this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }

MainActivity中接收fragment傳送的訊息

  @Subscribe(threadMode = ThreadMode.MAIN)
    public void FragmentButtonClicked(String str) {
        switch (str) {
            case "fragment1":
                Toast.makeText(getApplicationContext(), "fragment1點選", Toast.LENGTH_LONG).show();
                initFragmentSelected(1
);//展示fragment2介面 break; case "fragment2": Toast.makeText(getApplicationContext(), "fragment2點選", Toast.LENGTH_LONG).show(); initFragmentSelected(0);//展示fragment1介面 break; default: break; }

2.fragment1

fragment1中註冊和取消註冊的程式碼,旨在接收fragment2傳送的訊息

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

    @Override
    public void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }

點選fragment1中的按鈕點選,告訴MainActivity展示fragment2介面

  @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.tv1:
                EventBus.getDefault().post("fragment1");//告訴MainActivity,fragment1中的按鈕點選了
                break;
        }
    }

fragment1中處理fragment2傳送訊息的程式碼

  @Subscribe(threadMode = ThreadMode.MAIN)
    public void Fragment2ButtonClicked(MsgToSend msgToSend) {
        mTv1.setText("我是fragment111111111  後面的資訊是fragment2返回的資料:"+msgToSend.getMessage());
    }

3.fragment2

fragment2中的按鈕點選後,傳送了兩個訊息,一個是告訴MainActivity切換fragment1介面的訊息,一個是將實體MsgToSend告訴fragment1的訊息

 @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.tv2:
                EventBus.getDefault().post("fragment2");
                EventBus.getDefault().post(new MsgToSend("我是fragment2,我給你發個資訊"));
                break;
        }
    }

這就是通過eventBus實現Activity和fragment通訊、fragment和fragment通訊的小例子,特別的簡單,給eventBus點個贊