android t跳转到fragment,Android 使用EventBus进行Fragment和Activity通信
本文介紹EventBus的基本使用,以及用于Fragment和Activity之間通信。
github地址:?https://github.com/greenrobot/EventBus?版本是 EventBus-2.4.0 release
EventBus是基于訂閱和發(fā)布的一種通信機(jī)制,使用流程如下:
實(shí)例化EventBus對(duì)象
注冊(cè)訂閱者
發(fā)布消息
接受消息
對(duì)應(yīng)代碼
EventBus eventBus = newEventBus();
eventBus.register(subscriberobject);//注冊(cè)訂閱者
訂閱者對(duì)象中必須有 onEvent public方法public void onEvent(Object event){//接收消息
}
eventBus.post(event);//發(fā)送消息
應(yīng)用到Activity和Fragment中
因?yàn)橛嗛喺弑仨氂衞nEvent方法,因此我們創(chuàng)建一個(gè)基類(lèi)讓onEvent方法作為抽象方法
public abstract classBaseFragment extends Fragment {publicBaseFragment() {
}public abstract voidonEvent(MyEvent eventData);
}
MainActivity
public classMainActivity extends FragmentActivity {publicButton btn;publicEventBus eventBus;
@Overrideprotected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn=(Button) findViewById(R.id.btn);
eventBus= newEventBus();
FragmentManager fm=getSupportFragmentManager();
MyFragment myFragment= newMyFragment();
fm.beginTransaction().replace(R.id.container, myFragment).commit();
eventBus.register(myFragment);//注冊(cè)訂閱者 MyFragment
btn.setOnClickListener(newOnClickListener() {public voidonClick(View arg0) {
List list = new ArrayList();
list.add("test string");
MyEvent myEvent= newMyEvent();
myEvent.eventType= 1;
myEvent.data=list;
eventBus.post(myEvent);//發(fā)布消息
myEvent= newMyEvent();
myEvent.eventType= 2;
myEvent.data= new MyCallBack();//接口回調(diào)作為引用
eventBus.post(myEvent);//發(fā)布消息
}
});
}//此時(shí)MainActivity作為訂閱者
public void onEvent(MyEvent event) {
Log.d("", "onEvent >> callback main>>>" + event.data);
}//回調(diào)接口也可以做為事件數(shù)據(jù)
classMyCallBack implements DataCallBack {
@Overridepublic voidonCallback(MyEvent eventData) {
Log.d("", "eventData >>>>" +eventData);
}
}
}
封裝的消息MyEvent
public classMyEvent {publicMyEvent() {
}public int eventType;//可能類(lèi)型有很多種,數(shù)據(jù)也不一樣
public Object data;//數(shù)據(jù)對(duì)象
}
MyFragment
public classMyFragment extends BaseFragment {privateDataCallBack actCallback;privateEventBus eventBus;publicMyFragment() {
setHasOptionsMenu(true);
eventBus= newEventBus();
}
@OverridepublicView onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {return inflater.inflate(R.layout.fragment_main, null);
}
@Overridepublic voidonViewCreated(View view, Bundle savedInstanceState) {
view.findViewById(R.id.call).setOnClickListener(newOnClickListener() {public voidonClick(View view) {if (actCallback != null) { //得到接口后 回調(diào)一下
MyEvent event = newMyEvent();event.data = "this is fragment:" + MyFragment.this;
actCallback.onCallback(event);//調(diào)用回調(diào)
}
}
});
}
@Overridepublic voidonActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);if (getActivity() != null) {
eventBus.register(getActivity());//事件訂閱者注冊(cè),訂閱者為MainActivity
}
}
@Overridepublic void onEvent(MyEvent event) {int type = event.eventType;if (type == 1) {
Log.d("", "onEvent type 1:" + event.data);
}else if (type == 2) {
Log.d("", "onEvent type 2:" + (event.data instanceof DataCallBack));if (event.data instanceof DataCallBack) {
actCallback= ((DataCallBack) event.data);//得到回調(diào)//發(fā)消息給MainActivity
MyEvent event2 = newMyEvent();
event2.data= "call main activity method";
eventBus.post(event2);//發(fā)布消息
}
}
}
}
一般讓Fragment調(diào)用Activity的方法有一下幾種
創(chuàng)建Fragment的時(shí)候把MainActivity引用傳給Fragment,其實(shí)通過(guò)getActivity()也能獲取到實(shí)例
創(chuàng)建Fragment的時(shí)候傳入一個(gè)Handler實(shí)例,在Fragment中sendMessage也是可以的
創(chuàng)建Fragment的時(shí)候傳入一個(gè)實(shí)例化接口,作為回調(diào)
我覺(jué)得用接口的方式更加好,耦合性算是比較低的一種。當(dāng)Fragment pop后 getActivity()獲取的引用為NULL,傳入Handler實(shí)例是可以的,但有些時(shí)候你可能用不上Handler這個(gè)東西。
EventBus使用還是比較簡(jiǎn)單的,降低了代碼耦合性,只需要在onEvent中處理數(shù)據(jù)即可。
總結(jié)
以上是生活随笔為你收集整理的android t跳转到fragment,Android 使用EventBus进行Fragment和Activity通信的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 木瓜干的功效与作用、禁忌和食用方法
- 下一篇: android中的帧动画,[Androi