码迷,mamicode.com
首页 > 其他好文 > 详细

利用接口回调实现fragment与activity的通信

时间:2015-04-16 14:23:29      阅读:151      评论:0      收藏:0      [点我收藏+]

标签:android   接口回调   fragment和activity通信   

Fragment 与activity相互传递数据,可按如下方式进行:

1、Activity 向Fragment传递数据:在Activity中创建Bundle数据包(如果传输涉及对象,要实现对象的系列化),并调用Fragment的setArguments(Bundle      bundle)方法即可实现将Bundle数据包传给Fragment,这个很容易实现。

2、但是如果反过来呢,单我们点击触发Fragment的事件时,希望将数据返回Activity,Activity获得数据进行之后的操作,也就是Fragment主动向Activity传递数据,这也是本博文将要详细讲解的,利用接口回调实现fragment与activity的通信。


现在假设一个场景:假如Fragment1中是显示一些新闻的窗口,现在我们需要在点击新闻窗口的时候(这个新闻窗口是一个Android组件,下面代码假设它是一个Button,并将它与对应的URL绑定),把对应的uir返回Activity,Activity获取用户点击的新闻窗口信息URL,然后调用具体新闻的Fragment2进行显示具体新闻(把URL传给Fragment2,让Fragment2加载具体的新闻)。


Fragment1 的核心实现:

	class Fragment1 extends Fragment {

		- - - - - - -
		Button button ;
		//将button绑定网站url
		button.setText("www.baidu.com");
		- - - - - - -
		- - - - - - -
		OnMyclikListener myListener;
		//定义回调接口
		interface OnMyclikListener {
			public void onclik(View v) ;					
		}
		
		//定义供Activity调用的函数
		public void setOnclikListener(OnMyclikListener onMyclikListener) {
			this.myListener = onMyclikListener;				
		}
		
		button.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
                                //在这里将被点击的新闻窗口(v)传递给Activity
				myListener.onclik(v);
                                System.out.println("还有我");
			}
		});
		- - - - - - -
		- - - - - - -
		- - - - - - -
		
	}
Activity的核心实现
class MyActivity extends Activity {
	- - - - - - -
	//定义Fragment1,然后将Fragment添加到Activity,这里省略
	Fragment1 fragment;
	- - - - - - -
	- - - - - - -
	//在Activity里面调用Fragment的public函数,这个函数我们上面有定义
	fragment.setOnclikListener(new OnMyclikListener) {
		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			//注意,这个参数v,其实是Fragment1里button的句柄,我们可以通过它来访问button绑定的url
			Button button = (Button) v;
			String url = button.getText().toString();
		}
	}
	- - - - - - -
	- - - - - - -
	- - - - - - -
	- - - - - - -
}





梳理下执行顺序
1、首先,当我们点击Fragment1里面的button的时候,执行Fragment1里面的一面这部分函数
   
button.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				//在这里将被点击的新闻窗口(v)传递给Activity
				myListener.onclik(v);
                                System.out.println("还有我");
			}
		});
也就是执行

public void onClick(View v)

函数,但是当执行到

//在这里将被点击的新闻窗口(v)传递给Activity
myListener.onclik(v);
这句的时候,调用了定义接口的接口函数,并将v当做参数,这个v就是被点击的button的句柄
我们看看,这个接口函数的实现,是在Activity里面实现的,然后执行转到Activity
2、上面说到执行转到Activity,也就是Activity的这部分函数
//在Activity里面调用Fragment的public函数,这个函数我们上面有定义
	fragment.setOnclikListener(new OnMyclikListener) {
		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			//注意,这个参数v,其实是Fragment1里button的句柄,我们可以通过它来访问button绑定的url
			Button button = (Button) v;
			String url = button.getText().toString();
		}
	}
执行到这里,Activity就获得了Fragment1传递过来的Url了,实现了Fragment1主动向Activity传递数据
当这段函数执行完,然后又回到1</span>
button.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				//在这里将被点击的新闻窗口(v)传递给Activity
				myListener.onclik(v);
				System.out.println("还有我");
			}
		});
3、回到1中,继续执行


System.out.println("还有我");


亦即如下图所示
<img src="http://img.blog.csdn.net/20150416135630578?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDU3MTMxNg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
总之
1、用户Fragment1里面的button点击事件,就实现了Fragment1主动将数据Url传递给Activity,Activity获得url后,就可以进行以后的操作了
2、其实读者有没有感觉到接口回调的方式很像组件监听器的方式呢,是的,Android的组件监听接口也是回调接口,也是这么实现的






利用接口回调实现fragment与activity的通信

标签:android   接口回调   fragment和activity通信   

原文地址:http://blog.csdn.net/u010571316/article/details/45073613

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!