接口回调在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与Fragment通过接口回调进行通信_第1张图片Activity与Fragment通过接口回调进行通信_第2张图片

第一步是搭建工程框架:

Activity:1个 ;layout:3个;Fragment:2个  ;

MainActivity对应activity_main.layout  ;FragmentFirst对应fragment_first.xml  ;FragmentSecond对应fragment_second.xml  ;

工程目录结构如下图。

Activity与Fragment通过接口回调进行通信_第3张图片

第二步:写xml布局文件

在activity_main.xml文件里面包含了两个fragment控件。很显然包含的是我们要使用的两个fragment,如下图:

Activity与Fragment通过接口回调进行通信_第4张图片


再看fragment_first.xml文件,包含了两个按钮,用来出发事件,如下图:

Activity与Fragment通过接口回调进行通信_第5张图片


最后看一下fragment_second.xml文件,仅仅包含了一个TextVIew控件用于显示按钮触发后的内容显示,如下图:

Activity与Fragment通过接口回调进行通信_第6张图片

第三步: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


更多相关文章

  1. Android 利用JNI调用Android Java代码函数
  2. 访问Android内部RIL接口(一)
  3. Android中SensorManager.getRotationMatrix函数原理解释
  4. Android 框架层为IMountService 增加新接口
  5. Android中给Button加上selector——点击按钮后变成不一样的图片
  6. Android开发规范:API接口通用设计规范
  7. Android 无线接口层(Radio Layer Interface)

随机推荐

  1. Gridview的stretchMode详解附自动宽度
  2. Android中Button的使用
  3. Android(安卓)系统自带样式Androidtheme
  4. Android(安卓)4.0.3 源代码结构分析(一)
  5. android系统自带的主题与样式(theme and
  6. RelativeLayout
  7. Android(安卓)xml资源文件中@、@android:
  8. Android(安卓)SDK Android(安卓)NDK 官方
  9. Android下实现一个Activity的全屏显示
  10. Android启动流程——1序言、bootloader引