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

接口的声明:

<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.youkuaiyun.com/harvic880925/article/details/44917955

在MainActivity里面直接使用findFragmentById()函数获取frament_2,然后调用FragmentSecond里的public void setTv(String str)方法来控制控件的显示。

至此,就分析完了这个过程。不对的地方希望大家多多指正。

源代码在:http://download.youkuaiyun.com/detail/dingfengen/9504561


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值