EventBus 3.0實現Activity和fragment通訊、fragment和fragment通訊
阿新 • • 發佈:2019-02-15
注意:說兩個坑
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點個贊