Fragment与Activity进行通信

前言

  Fragment是android开发中常用的一个控件,我们可以在Fragment内部进行不同的控件之间的通信,如点击了一个按钮就可以在一个TextView上显示一个数据,因为Button和TextView都是在Fragment内部,能够得到它们的对象,所以我们当然可以进行通信,那么,点击Fragment内部的按钮能够在Activity中的TextView上显示吗?我们在Fragment内部没法直接得到Activity中的对象,所以本文就是教大家如何在Fragment和Activity之间进行通信。

实现

  Fragment和Activity之间的通信就是把Fragment的数据传到Activity中,当然我们可以使用静态变量,在Fragment内部就可以使用Activity中静态变量,当然也就可以把数据传输了过去,但是,这种方法太low了,绝对会被别人说没水平,而且代码之间的耦合性太高,是我们所不欢迎的,那么我们就要使用另一种方法 – 接口。

  接口是java中的语法,以前不太明白接口的使用,但是真正使用了接口时候才会明白接口的好处,本文就是利用接口实现通信的。

  我们先来看一下效果图:


  可以看到,图中灰色的是一个Fragment,里面有两个按钮和一个TextView,点击按钮之后,在Activity中显示按钮的文字,我们需要做的就是在Fragment和Activity中简历联系,把按钮的文字传递过去。

  这里我们定义一个接口:IFragmentListener

public interface IFragmentListener {
    void onFragmentClick(View v);
}

  在接口里面有一个方法,传入的参数是一个View对象,这个View对象就是被点击的控件的对象,传入之后在Activity中得到这个对象就可以得到被点击控件的信息了。

  下面是Fragment的代码:

public class MyFragment extends Fragment implements OnClickListener{

    private Button btn_java,btn_c;
    private IFragmentListener mListener;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.v_fragment, container,false);
        initView(v);
        return v;
    }

    private void initView(View v) {
        btn_c = (Button) v.findViewById(R.id.btn_c);
        btn_java = (Button) v.findViewById(R.id.btn_java);
        btn_c.setOnClickListener(this);
        btn_java.setOnClickListener(this);
    }

    /**
     * Fragment和Activity绑定起来
     */
    @Override
    public void onAttach(Activity activity){
        super.onAttach(activity);
        mListener = (IFragmentListener) activity;
    }

    @Override
    public void onClick(View v) {
        mListener.onFragmentClick(v);
    }

}

  在MyFragment里面我们定义了IFragmentListener的对象,然后在onAttach中给mListener赋值。那么,问题来了,onAttach是什么方法,有什么用?

  关于这个问题就必须要牵扯到Fragment的生命周期了,类似Activity的生命周期,但是本文不打算在这里深入讲解它,只会告诉你onAttach方法的作用。onAttch方法是Fragment生命周期中的一个方法,它的作用就是把Fragment所依附的Activity的对象传入到Fragment中,也就是说我们在Fragment中可以得到Activity的对象。那么我们拿到Activity的对象有什么用呢?还是先来看看MainAcitivity的代码吧:

public class MainActivity extends Activity implements IFragmentListener{

    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public void onFragmentClick(View v){
        String data = ((Button)v).getText().toString();
        ((TextView)findViewById(R.id.text)).setText(data);

    }

}

  可以看到原来我们的MainActivity继承了IFragmentListener接口,即继承onFragmentClick方法,在MyFragment的onAttach方法里面传入的继承了IFragmentListener接口的MainAcitivty对象,当mListener对象的onFragmentClick方法被调用的时候执行的就是MainAcitivyt中的方法,也就是View对象被传入到了Activity中,我们就可以在Activity中得到了被点击的Fragment中的控件对象然后进行我们想要的操作。

小结

  接口的使用可以降低Fragment和Activity中的耦合性,如果在Fragment中使用Activity中的静态变量,那么这个Fragment只能与当前Activity进行绑定,就不能和其他的Activity进行绑定了,这样就不能做到Fragment的通用性,在开发中尽量避免这样的问题,不断的去优化自己的代码,降低耦合才是我们的目标。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值