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

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

时间:2015-04-16 17:48:43      阅读:120      评论: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 的核心实现:

[java] view plaincopy
  1. class Fragment1 extends Fragment {  
  2.   
  3.     - - - - - - -  
  4.     Button button ;  
  5.     //将button绑定网站url  
  6.     button.setText("www.baidu.com");  
  7.     - - - - - - -  
  8.     - - - - - - -  
  9.     OnMyclikListener myListener;  
  10.     //定义回调接口  
  11.     interface OnMyclikListener {  
  12.         public void onclik(View v) ;                      
  13.     }  
  14.       
  15.     //定义供Activity调用的函数  
  16.     public void setOnclikListener(OnMyclikListener onMyclikListener) {  
  17.         this.myListener = onMyclikListener;               
  18.     }  
  19.       
  20.     button.setOnClickListener(new OnClickListener() {  
  21.           
  22.         @Override  
  23.         public void onClick(View v) {  
  24.             // TODO Auto-generated method stub  
[java] view plaincopy
  1. //在这里将被点击的新闻窗口(v)传递给Activity  
[java] view plaincopy
  1.                                System.out.println("还有我");  
  2.         }  
  3.     });  
  4.     - - - - - - -  
  5.     - - - - - - -  
  6.     - - - - - - -  
  7.       
  8. }  
[java] view plaincopy
  1. Activity的核心实现  
[java] view plaincopy
  1. class MyActivity extends Activity {  
  2.     - - - - - - -  
  3.     //定义Fragment1,然后将Fragment添加到Activity,这里省略  
  4.     Fragment1 fragment;  
  5.     - - - - - - -  
  6.     - - - - - - -  
  7.     //在Activity里面调用Fragment的public函数,这个函数我们上面有定义  
  8.     fragment.setOnclikListener(new OnMyclikListener) {  
  9.         @Override  
  10.         public void onClick(View v) {  
  11.             // TODO Auto-generated method stub  
  12.             //注意,这个参数v,其实是Fragment1里button的句柄,我们可以通过它来访问button绑定的url  
  13.             Button button = (Button) v;  
  14.             String url = button.getText().toString();  
  15.         }  
  16.     }  
  17.     - - - - - - -  
  18.     - - - - - - -  
  19.     - - - - - - -  
  20.     - - - - - - -  
  21. }  





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

public void onClick(View v)

函数,但是当执行到

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

3、回到1中,继续执行

亦即如下图所示

技术分享


[java] view plaincopy
  1.   
[java] view plaincopy
  1. 总之  
[java] view plaincopy
  1. 1、用户Fragment1里面的button点击事件,就实现了Fragment1主动将数据Url传递给Activity,Activity获得url后,就可以进行以后的操作了  
[java] view plaincopy
  1. 2、其实读者有没有感觉到接口回调的方式很像组件监听器的方式呢,是的,Android的组件监听接口也是回调接口,也是这么实现的  

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

标签:android   fragment和activity通信   

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

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