Activity与Fragment通过接口回调进行通信
2016-04-27 17:37
344 查看
接口回调在Android中有很多的应用,比如Activity里的onCreat、onDestroy等方法,按键事件监听。Android对Fragment的是在Android3.0时加入的,所以Android3.0
以前的系统并不支持Fragment,而为了使3.0以前的版本也支持Fragment,Google便推出了Android-support-v4.jar。我这里使用的是Android系统自带的Fragment,而不是使用Android-support-v4.jar包里的Fragment。Activity添加Fragment有静态和动态两种方式,本文使用静态方式添加Fragment。下面具体介绍:
本工程实现的功能是:点击FragmentFirst里的FirstBtn按钮在FragmentSecond里显示“点击了btn1”,点击FragmentFirst里的SecondBtn按钮在FragmentSecond里显示“点击了btn2”。效果图如下
第一步是搭建工程框架:
Activity:1个 ;layout:3个;Fragment:2个 ;
MainActivity对应activity_main.layout ;FragmentFirst对应fragment_first.xml ;FragmentSecond对应fragment_second.xml ;
工程目录结构如下图。
第二步:写xml布局文件
在activity_main.xml文件里面包含了两个fragment控件。很显然包含的是我们要使用的两个fragment,如下图:
再看fragment_first.xml文件,包含了两个按钮,用来出发事件,如下图:
最后看一下fragment_second.xml文件,仅仅包含了一个TextVIew控件用于显示按钮触发后的内容显示,如下图:
第三步:FragmentFirst、FragmentSecond、MainActivity的实现
FragmentFirst与MainActivity之间使用接口回调的方法进行通信。总体来说,在FragmentFirst里声明、定义、初始化、使用接口FragmentFirstInterface,FragmentFirstInterface 在类FragmentFirst里面;而在MainActivity里面继承接口FragmentFirstInterface,并具体实现接口函数public
void fragment_first_callback(String str);
接口的声明:
接口的定义:
在Fragment的回调函数onAttach里面对接口进行初始化:
接口的使用是在点击按钮的时候:
这样在FragmentFirst对接口的操作已经完成,那么点击了按钮以后在MainActivity里是如何处理就能是activity接受到这个按钮的点击事件呢?首先是MainActivity继承回调接口,然后实现接口回调函数:
到这里呢,MainActivity就获得了FragmentFirst的点击事件。其实这个有点像C语言里的函数调用,在fragment里面需要的地方调用回调函数,在activity里具体实现该函数。那么再MainActivity里获取FragmentFirst的点击事件后如何通知FragmentSecond进行显示呢?看下面FragmentSecond里的代码:
在FragmentSecond的回调函数onActivityCreated里面初始化TextView,这里由于Fragment的生命周期的问题,这个不能在onCreateView中实现。具体原因,大家可以看这个博客:http://blog.csdn.net/harvic880925/article/details/44917955
在MainActivity里面直接使用findFragmentById()函数获取frament_2,然后调用FragmentSecond里的public void setTv(String str)方法来控制控件的显示。
至此,就分析完了这个过程。不对的地方希望大家多多指正。
源代码在:http://download.csdn.net/detail/dingfengen/9504561
以前的系统并不支持Fragment,而为了使3.0以前的版本也支持Fragment,Google便推出了Android-support-v4.jar。我这里使用的是Android系统自带的Fragment,而不是使用Android-support-v4.jar包里的Fragment。Activity添加Fragment有静态和动态两种方式,本文使用静态方式添加Fragment。下面具体介绍:
本工程实现的功能是:点击FragmentFirst里的FirstBtn按钮在FragmentSecond里显示“点击了btn1”,点击FragmentFirst里的SecondBtn按钮在FragmentSecond里显示“点击了btn2”。效果图如下
第一步是搭建工程框架:
Activity:1个 ;layout:3个;Fragment:2个 ;
MainActivity对应activity_main.layout ;FragmentFirst对应fragment_first.xml ;FragmentSecond对应fragment_second.xml ;
工程目录结构如下图。
第二步:写xml布局文件
在activity_main.xml文件里面包含了两个fragment控件。很显然包含的是我们要使用的两个fragment,如下图:
再看fragment_first.xml文件,包含了两个按钮,用来出发事件,如下图:
最后看一下fragment_second.xml文件,仅仅包含了一个TextVIew控件用于显示按钮触发后的内容显示,如下图:
第三步:FragmentFirst、FragmentSecond、MainActivity的实现
FragmentFirst与MainActivity之间使用接口回调的方法进行通信。总体来说,在FragmentFirst里声明、定义、初始化、使用接口FragmentFirstInterface,FragmentFirstInterface 在类FragmentFirst里面;而在MainActivity里面继承接口FragmentFirstInterface,并具体实现接口函数public
void fragment_first_callback(String str);
接口的声明:
<span style="white-space:pre"> </span>/* * 回调接口声明 * */ public interface FragmentFirstInterface { public void fragment_first_callback(String str); }
接口的定义:
<span style="white-space:pre"> </span>/* * 回调接口定义 * */ private FragmentFirstInterface fragmentFirstInterface;
在Fragment的回调函数onAttach里面对接口进行初始化:
<span style="white-space:pre"> </span>@Override public void onAttach(Activity activity){ super.onAttach(activity); /* * 回调接口初始化 * */ fragmentFirstInterface = (FragmentFirstInterface) activity; }
接口的使用是在点击按钮的时候:
<span style="white-space:pre"> </span>getActivity().findViewById(R.id.btn_1).setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { /* * 调用回调接口函数 * */ fragmentFirstInterface.fragment_first_callback("btn1"); } }); getActivity().findViewById(R.id.btn_2).setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { /* * 调用回调接口函数 * */ fragmentFirstInterface.fragment_first_callback("btn2"); } });
这样在FragmentFirst对接口的操作已经完成,那么点击了按钮以后在MainActivity里是如何处理就能是activity接受到这个按钮的点击事件呢?首先是MainActivity继承回调接口,然后实现接口回调函数:
public class MainActivity extends Activity implements FragmentFirstInterface{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public void fragment_first_callback(String str) { // TODO Auto-generated method stub if(str.equals("btn1")){ FragmentManager fragmentManager = getFragmentManager(); FragmentSecond fragmentSecond = (FragmentSecond)fragmentManager.findFragmentById(R.id.frament_2); fragmentSecond.setTv("btn1"); } if(str.equals("btn2")){ FragmentManager fragmentManager = getFragmentManager(); FragmentSecond fragmentSecond = (FragmentSecond)fragmentManager.findFragmentById(R.id.frament_2); fragmentSecond.setTv("btn2"); } } }
到这里呢,MainActivity就获得了FragmentFirst的点击事件。其实这个有点像C语言里的函数调用,在fragment里面需要的地方调用回调函数,在activity里具体实现该函数。那么再MainActivity里获取FragmentFirst的点击事件后如何通知FragmentSecond进行显示呢?看下面FragmentSecond里的代码:
public class FragmentSecond extends Fragment{ TextView fs_tv; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_second, container, false); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); fs_tv = (TextView)getActivity().findViewById(R.id.fs_tv); } public void setTv(String str){ fs_tv.setText("点击了" + str); } }
在FragmentSecond的回调函数onActivityCreated里面初始化TextView,这里由于Fragment的生命周期的问题,这个不能在onCreateView中实现。具体原因,大家可以看这个博客:http://blog.csdn.net/harvic880925/article/details/44917955
在MainActivity里面直接使用findFragmentById()函数获取frament_2,然后调用FragmentSecond里的public void setTv(String str)方法来控制控件的显示。
至此,就分析完了这个过程。不对的地方希望大家多多指正。
源代码在:http://download.csdn.net/detail/dingfengen/9504561
相关文章推荐
- HTTP TRACE / TRACK Methods Allowed 漏洞修复
- java连接mysql数据库
- 我自己作为一个IT人员的感想
- ViewPager+Fragment缓存view的正确方式
- 使用Markdown 写邮件
- 上机题-进制转换
- IOS开发中(null)与<null>的处理
- Android Studio方法注释模板
- iptables学习笔记3——命令详解及举例
- 第9周-项目1-阅读程序并写出运行结果理解(1)
- tddl+diamond(二)
- MAC OSX10.10上搭建Apache,PHP,MySQL5.6.22,phpMyAdmin开发环境
- 【排序算法】归并排序原理及Java实现
- android 控件 下拉刷新 ActionBar-PullToRefresh
- 解决dispatchKeyEvent监听执行两次
- php 数组常用函数
- 不同的方式启动exe 引发的后果
- 非递归二分法查找出值的下表
- zabbix agent之windows
- 算法入门系列1:k-means