Activity与Fragment通过接口回调进行通信
接口回调在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);
接口的声明:
/* * 回调接口声明 * */public interface FragmentFirstInterface {public void fragment_first_callback(String str);}
接口的定义:
/* * 回调接口定义 * */private FragmentFirstInterface fragmentFirstInterface;
在Fragment的回调函数onAttach里面对接口进行初始化:
@Overridepublic void onAttach(Activity activity){super.onAttach(activity);/* * 回调接口初始化 * */fragmentFirstInterface = (FragmentFirstInterface) activity;}
接口的使用是在点击按钮的时候:
getActivity().findViewById(R.id.btn_1).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {/* * 调用回调接口函数 * */fragmentFirstInterface.fragment_first_callback("btn1");}}); getActivity().findViewById(R.id.btn_2).setOnClickListener(new OnClickListener() {@Overridepublic 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); }@Overridepublic void fragment_first_callback(String str) {// TODO Auto-generated method stubif(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); }@Overridepublic 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
更多相关文章
- Android 利用JNI调用Android Java代码函数
- 访问Android内部RIL接口(一)
- Android中SensorManager.getRotationMatrix函数原理解释
- Android 框架层为IMountService 增加新接口
- Android中给Button加上selector——点击按钮后变成不一样的图片
- Android开发规范:API接口通用设计规范
- Android 无线接口层(Radio Layer Interface)