您的位置:首页 > 其它

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);

接口的声明:

<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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: