标签: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的组件监听接口也是回调接口,也是这么实现的
标签:android 接口回调 fragment和activity通信
原文地址:http://blog.csdn.net/u010571316/article/details/45073613