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
- 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
[java] view
plaincopy
- //在这里将被点击的新闻窗口(v)传递给Activity
[java] view
plaincopy
- System.out.println("还有我");
- }
- });
- - - - - - - -
- - - - - - - -
- - - - - - - -
- }
[java] view
plaincopy
- Activity的核心实现
[java] view
plaincopy
- 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();
- }
- }
- - - - - - - -
- - - - - - - -
- - - - - - - -
- - - - - - - -
- }
[java] view
plaincopy
- 梳理下执行顺序
[java] view
plaincopy
- 1、首先,当我们点击Fragment1里面的button的时候,执行Fragment1里面的一面这部分函数
[java] view
plaincopy
- button.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- //在这里将被点击的新闻窗口(v)传递给Activity
- myListener.onclik(v);
[java] view
plaincopy
- System.out.println("还有我");
[java] view
plaincopy
- }
- );
也就是执行
public void onClick(View v)
函数,但是当执行到
[java] view
plaincopy
- //在这里将被点击的新闻窗口(v)传递给Activity
- myListener.onclik(v);
[java] view
plaincopy
- 这句的时候,调用了定义接口的接口函数,并将v当做参数,这个v就是被点击的button的句柄
[java] view
plaincopy
- 我们看看,这个接口函数的实现,是在Activity里面实现的,然后执行转到Activity
[java] view
plaincopy
- 2、上面说到执行转到Activity,也就是Activity的这部分函数
[java] view
plaincopy
- //在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();
- }
- }
[java] view
plaincopy
- 执行到这里,Activity就获得了Fragment1传递过来的Url了,实现了Fragment1主动向Activity传递数据
[java] view
plaincopy
- 当这段函数执行完,然后又回到1</span>
[java] view
plaincopy
- button.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- //在这里将被点击的新闻窗口(v)传递给Activity
- myListener.onclik(v);
[java] view
plaincopy
- System.out.println("还有我");
[java] view
plaincopy
- }
- );
3、回到1中,继续执行
亦即如下图所示
[java] view
plaincopy
[java] view
plaincopy
- 总之
[java] view
plaincopy
- 1、用户Fragment1里面的button点击事件,就实现了Fragment1主动将数据Url传递给Activity,Activity获得url后,就可以进行以后的操作了
[java] view
plaincopy
- 2、其实读者有没有感觉到接口回调的方式很像组件监听器的方式呢,是的,Android的组件监听接口也是回调接口,也是这么实现的