Activity与Fragment通信——回调方法实现
2016-06-14 17:16
423 查看
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发送消息:创建回调方法接口类
public interface MyCallBack { public void callBack(String message); }
让Activity实现该接口 并 实现接口定义的方法
public class MainActivity extends Activity implements MyCallBack{ ...... @Override public void callBack(String message) { Log.d("myinfo", "MainActivity接受到的消息是:" + message); } }
在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; } }
在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; }}
相关文章推荐
- fastjson处理接口时的一个问题
- 局域网与广域网接口标准
- RJ-45接口信号定义
- DVI 视频接口图文解析
- C#实现子窗体与父窗体通信方法实例总结
- 如何设置域名接口
- 通过C#实现自动售货机接口
- C#中IEnumerable接口用法实例分析
- C#中实现判断某个类是否实现了某个接口
- C#隐式/显示实现接口方法详解
- C#实现两接口中同名方法实例分析
- 详解C#中的接口属性以及属性访问器的访问限制
- C#中的ICustomFormatter及IFormatProvider接口用法揭秘
- C#接口实现方法实例分析
- java和c#使用hessian通信的方法
- win32下进程间通信(共享内存)实例分析
- 基于C# 中可以new一个接口?的问题分析
- C#抽象类和接口的区别分析
- 详细解读PHP中接口的应用
- php单一接口的实现方法