参考文章
http://blog.csdn.net/guozh/article/details/25327685#comments
Activity和fragment通信方式一般有3种方法
1.在fragment中定义接口, Activity去实现接口--->查看上面的参考文章
2.使用广播机制
3.使用EventBus
这3种方式 推荐使用EventBus
下面介绍第2种方式广播通信机制:
首先MainActivity中引入一个fragment, activity的布局很简单,里面只有一个 framelayout.
LeftFragment布局中只有一个TextView, 它去替换MainActivity中的framelayout
public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); System.out.println("MainActivity -- onCreate"); FragmentManager fm = this.getSupportFragmentManager(); // 在Activity中注册 fragment, 也可以在清档文件中注册 fm.beginTransaction() .replace(R.id.flContent, new LeftFragment(), "left").commit(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int itemId = item.getItemId(); // 通过发送广播消息给 fragment Intent intent = new Intent(); if (R.id.left == itemId) { intent.setAction("left"); LocalBroadcastManager.getInstance(this).sendBroadcast(intent); } return true; } }
LeftFragment代码如下:
public class LeftFragment extends Fragment { private TextView message; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 在fragment中注册一个广播用于接收,Activity中发送过来的消息 IntentFilter filter = new IntentFilter(); filter.addAction("left"); LocalBroadcastManager.getInstance(getContext()).registerReceiver( new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // 去做一些业务处理,比如联网操作, 解析操作... message.setText("LeftFragment,收到了Activity发了的--->left<---广播"); } }, filter); } @Override @Nullable public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = View.inflate(getContext(), R.layout.fragment_left, null); message = (TextView) view.findViewById(R.id.message); return view; } }
点击ActionBar的 left_item 按钮--->运行效果图:
点击left_Item后,就会切换到 fragment去显示内容.
然后就是第三种通信方式: EventBus
一、概述
EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅。以及将发送者和接收者解耦。
1.下载EventBus的类库
源码:https://github.com/greenrobot/EventBus
2.EventBus使用步骤:
1>Define events: 任意定义一个事件 public class MessageEvent { /* Additional fields if needed */ }
2>Prepare subscribers: 注册我们的订阅者 eventBus.register(this);
public void onEvent(AnyEventType event) {/* Do something */};
3>Post events: 发布者 eventBus.post(event);
如果使用Gradle需要导入包:compile 'de.greenrobot:eventbus:2.4.0'
3.简单例子
在MainActivity中使用EventBus的post方法 随便发送一个消息给Fragment
public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); this.getSupportFragmentManager().beginTransaction() .replace(R.id.flContent, new LeftFragment(), "left").commit(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // 1.Activity随便发送一个消息给fragment EventBus.getDefault().post("change"); return true; } }
Fragment中需要做2个操作:
注册EventBus 和 接收 Activity发送过来的通信消息
public class LeftFragment extends Fragment { private TextView message; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 1. 接收者fragment中注册需EventBus EventBus.getDefault().register(this); } @Override @Nullable public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = View.inflate(getContext(), R.layout.fragment_left, null); message = (TextView) view.findViewById(R.id.message); return view; } /** * 接收activity传递过来的消息 因为activity传递的是一个字符串,所以这里参数是String * @param txt */ public void onEvent(String txt) { if (txt.equals("change")) { message.setText("fragment和activity通信成功了"); // 可以做一些其他业务,比如获取网络连接,刷新页面... } } }
布局文件和 广播通信的布局完全一样,运行效果图如下:
以上只是EventBus的最简单的通信机制,他还有其他一些重要方法
转载:http://blog.csdn.net/lmj623565791/article/details/40920453
转载:http://blog.csdn.net/harvic880925/article/details/40660137