android中fragment与activity之间通信原理以及例子

参考文章

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

 

posted @ 2016-01-11 19:58  半夜点烟  阅读(2089)  评论(0编辑  收藏  举报