Activity将信息传递给Fragment
- 通过Fragment的事物,挂载我们需要测试的Fragment
mTransaction = mFragmentManager.beginTransaction();
mTransaction.replace(R.id.fl_blank,new Fragment01(),"frag01");
- 通过Tag属性,直接拿到测试的Fragment对象。调用Fragment里的方法,控制Fragment的控件
Fragment01 frag01 = (Fragment01) mFragmentManager.findFragmentByTag("frag01");
frag01.setText("K.0");
public void setText(String content) {
jiangli.setVisibility(View.VISIBLE);
mTvFragment01.setText(content);
}
Fragment将信息传递给Activity:
- 通过getActivity()可以拿到挂载到的Activity的对象。
- 调用Acticity里的方法,控制Acticity的控件
MainActivity main = (MainActivity) getActivity();
main.setSendMassage("生锈的铁剑");
public void setSendMassage(String string) {
mSendMassage.setText(string);
}
具体效果如下:
Fragment之间的信息传递
在一个Fragment内部,很难实时拿到其他Fragment的对象实例,自然也就无法操作其他Fragment的控件,这时候可以借助一个开源框架–EventBus。
在这个Demo中只是展示了基础用法,深入的使用可以在它的github上看到:https://github.com/greenrobot/EventBus/
1.信息传递的载体类:
- 将需要传递的信息,作为该类的属性赋值,在传递时,直接传递的是该类的实例对象,取信息的时候,直接拿该类的属性值。
public class Event {
private String mMsg;
public Event(String msg) {
mMsg = msg;
}
public String getMsg(){
return mMsg;
}
}
2.ContentFragment
- 在onActivityCreated方法里注册EventBus
//注册事件接收器
EventBus.getDefault().register(this);
- 创建解析载体类的方法,务必加上@Subscribe:
/**
* threadMode为回调所在的线程,priority为优先级,sticky为是否接收黏性事件。
* @param event 载体类
*/
@Subscribe(threadMode = ThreadMode.POSTING, priority = 0, sticky = true)
public void MyEvent(Event event) {
String name = event.getMsg();
mContent.setText(name+"打了十个");
}
3.TitleFragment通过EventBus发送消息:
/**
* TitleFragment四个按钮的点击事件
* @param v
*/
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.fragment01:
EventBus.getDefault().post(new Event("赵日天"));
break;
case R.id.fragment02:
EventBus.getDefault().post(new Event("叶良辰"));
break;
case R.id.fragment03:
EventBus.getDefault().post(new Event("龙傲天"));
break;
case R.id.fragment04:
EventBus.getDefault().post(new Event("刘斩仙"));
break;
}
}
具体实现效果如下: