zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    docker之Dockerfile实践
    使用dockerfile构建nginx镜像 转
    docker 批量删除含有同样名字的images
    redis扩展
    cocos2dx进阶学习之CCBI文件
    cocos2d-x游戏开发系列教程-超级玛丽09-怪物激活与移动
    cocos2d-x游戏开发系列教程-超级玛丽08-消息机制
    cocos2d-x游戏开发系列教程-超级玛丽07-CMGameMap(六)-马里奥跳跃
    cocos2d-x游戏开发系列教程-超级玛丽07-CMGameMap(五)-地图卷动
    cocos2d-x游戏开发系列教程-超级玛丽07-CMGameMap(四)-马里奥平移
  • 原文地址:https://www.cnblogs.com/android-zcq/p/5122375.html
Copyright © 2011-2022 走看看