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.setText("www.baidu.com");
-
- - - - - - -
-
- - - - - - -
-
OnMyclikListener myListener;
-
-
interface OnMyclikListener {
-
public void onclik(View v) ;
-
}
-
-
-
public void setOnclikListener(OnMyclikListener onMyclikListener) {
-
this.myListener = onMyclikListener;
-
}
-
-
button.setOnClickListener(new OnClickListener() {
-
-
@Override
-
public void onClick(View v) {
-
-
System.out.println("还有我");
-
}
-
});
-
- - - - - - -
-
- - - - - - -
-
- - - - - - -
-
-
}
-
class MyActivity extends Activity {
-
- - - - - - -
-
-
Fragment1 fragment;
-
- - - - - - -
-
- - - - - - -
-
-
fragment.setOnclikListener(new OnMyclikListener) {
-
@Override
-
public void onClick(View v) {
-
-
-
Button button = (Button) v;
-
String url = button.getText().toString();
-
}
-
}
-
- - - - - - -
-
- - - - - - -
-
- - - - - - -
-
- - - - - - -
-
}
-
1、首先,当我们点击Fragment1里面的button的时候,执行Fragment1里面的一面这部分函数
-
button.setOnClickListener(new OnClickListener() {
-
-
@Override
-
public void onClick(View v) {
-
-
-
myListener.onclik(v);
-
System.out.println("还有我");
也就是执行
public void onClick(View v)
函数,但是当执行到
-
这句的时候,调用了定义接口的接口函数,并将v当做参数,这个v就是被点击的button的句柄
-
我们看看,这个接口函数的实现,是在Activity里面实现的,然后执行转到Activity
-
2、上面说到执行转到Activity,也就是Activity的这部分函数
-
-
fragment.setOnclikListener(new OnMyclikListener) {
-
@Override
-
public void onClick(View v) {
-
-
-
Button button = (Button) v;
-
String url = button.getText().toString();
-
}
-
}
-
执行到这里,Activity就获得了Fragment1传递过来的Url了,实现了Fragment1主动向Activity传递数据
-
button.setOnClickListener(new OnClickListener() {
-
-
@Override
-
public void onClick(View v) {
-
-
-
myListener.onclik(v);
-
System.out.println("还有我");
3、回到1中,继续执行
亦即如下图所示

-
1、用户Fragment1里面的button点击事件,就实现了Fragment1主动将数据Url传递给Activity,Activity获得url后,就可以进行以后的操作了
-
2、其实读者有没有感觉到接口回调的方式很像组件监听器的方式呢,是的,Android的组件监听接口也是回调接口,也是这么实现的
利用接口回调实现fragment与activity的通信
原文:http://blog.csdn.net/u010571316/article/details/45076051