Activity与Fragment通信——回调方法实现

Activity与Fragment通信——回调方法实现

1. 回调方法的介绍:

  • 所谓回调,就是客户程序C调用服务程序S中的某个函数A,然后S又在某个时候反过来调用C中的某个函数B,对于C来说,这个B便叫做回调函数。例如Win32下的窗口过程函数就是一个典型的回调函数。一般说来,C不会自己调用B,C提供B的目的就是让S来调用它,而且是C不得不提供。由于S并不知道C提供的B姓甚名谁,所以S会约定B的接口规范(函数原型),然后由C提前通过S的一个函数R告诉S自己将要使用B函数,这个过程称为回调函数的注册,R称为注册函数。Web Service以及Java的RMI都用到回调机制,可以访问远程服务器程序。

下面举个通俗的例子:

  • 某天,我打电话向你请教问题,当然是个难题,^_^,你一时想不出解决方法,我又不能拿着电话在那里傻等,于是我们约定:等你想出办法后打手机通知我,这样,我就挂掉电话办其它事情去了。过了XX分钟,我的手机响了,你兴高采烈的说问题已经搞定,应该如此这般处理。故事到此结束。这个例子说明了“异步+回调”的编程模式。其中,你后来打手机告诉我结果便是一个“回调”过程;我的手机号码必须在以前告诉你,这便是注册回调函数;我的手机号码应该有效并且手机能够接收到你的呼叫,这是回调函数必须符合接口规范。
—–以上内容摘自网络

2. Activity与Fragment利用回调方法进行通信

Fragment向Activity发送消息:

  1. 创建回调方法接口类

    public interface MyCallBack {   
        public void callBack(String message);
    }
    
  2. 让Activity实现该接口 并 实现接口定义的方法

    public class MainActivity extends Activity implements MyCallBack{
        ......
        @Override
        public void callBack(String message) {
            Log.d("myinfo", "MainActivity接受到的消息是:" + message);
        }
    }
    
  3. 在Fragment中获取与其绑定的Activity的引用(这里onAttach()方法要注意,后面会讲到)

    public class MyFragment extends Fragment {      
        private MyCallBack myCallBack;      
        ......
    
            @Override
            public void onAttach(Context context) {
                super.onAttach(context);
    
                if (!(context instanceof MyCallBack)) {
                    throw new IllegalStateException("MyFragment所在的Activity必须实现MyCallBack接口!");
                }
                myCallBack = (MyCallBack) context;
            }
    }
    
  4. 在Fragment中向Activity传递消息

    myCallBack.callBack("这是从MyFragment发出的消息!");
    

注意:

Fragment的生命周期方法有两个onAttach()方法,根据Android版本的不同会调用不同的方法

@Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);

        if (!(activity instanceof MyCallBack)) {
            throw new IllegalStateException("MyFragment所在的Activity必须实现MyCallBack接口!");
        }
        myCallBack = (MyCallBack) activity;
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);

        if (!(context instanceof MyCallBack)) {
            throw new IllegalStateException("MyFragment所在的Activity必须实现MyCallBack接口!");
        }
        myCallBack = (MyCallBack) context;
    }

具体代码:

MyCallBack:

    package com.zhenggy.test;

    /**
     * Created by ashzheng on 2016/6/14.
     */
    public interface MyCallBack {

        public void callBack(String message);
    }

MainActivity:

    package com.zhenggy.test;

    import android.app.Activity;
    import android.app.FragmentManager;
    import android.app.FragmentTransaction;
    import android.os.Bundle;
    import android.util.Log;

    public class MainActivity extends Activity implements MyCallBack {


        private FragmentManager fragmentManager;
        private MyFragment myFragment;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            fragmentManager = getFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

            if (null != myFragment) {
                fragmentTransaction.show(myFragment);
            } else {
                myFragment = new MyFragment();
                fragmentTransaction.add(R.id.activity_main_show_fragment_layout, myFragment);
            }
            fragmentTransaction.commit();
        }

        @Override
        public void callBack(String message) {
            Log.d("myinfo", "MainActivity接受到的消息是:" + message);
        }
    }

MyFragment:

    package com.zhenggy.test;

    import android.app.Activity;
    import android.app.Fragment;
    import android.content.Context;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;


    /**
     * Created by ashzheng on 2016/6/14.
     */
    public class MyFragment extends Fragment {

        private MyCallBack myCallBack;

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

            View myFragment = inflater.inflate(R.layout.fragment_my, container, false);

            myFragment.findViewById(R.id.bt).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Log.d("myinfo", "MyFragment发出消息");
                    myCallBack.callBack("这是从MyFragment发出的消息!");
                }
            });


            return myFragment;
        }

        @Override
        public void onAttach(Activity activity) {
            super.onAttach(activity);

            if (!(activity instanceof MyCallBack)) {
                throw new IllegalStateException("MyFragment所在的Activity必须实现MyCallBack接口!");
            }
            myCallBack = (MyCallBack) activity;
        }

        @Override
        public void onAttach(Context context) {
            super.onAttach(context);

            if (!(context instanceof MyCallBack)) {
                throw new IllegalStateException("MyFragment所在的Activity必须实现MyCallBack接口!");
            }
            myCallBack = (MyCallBack) context;
        }
    }
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值