Activity与Fragment之间的通信详解

      当我们使用Fragment的时候会常常与其他的Fragment或者宿主Activity进行交互,今天我们就来讲讲Fragment和Activity之间如何进行通信。

      一、 接口回调机制

     在讲Fragment和Android通信之前,我们先看一个应用场景,现在有一个需求,在Activity中有一个Button,有个一TextView。现在业务要求是这样,点击Button,改变TextView的值。这是一个再简单不过的Demo,我们通常会这样实现,实例化两个控件,然后为Button添加一个onClickListener事件,然后当前Activity实现onClickListener接口,实现onClick方法。在onClik方法中改变TextView的值。怎么样是不是很简单?接下来,我们说回Fragment,现在你就把Fragment假想成一个Button,当Fragment中有事件触发,修改Activity中是视图信息。逻辑和实现Button的点击事件一样。我们在fragment里面定义一个回调接口(相当于Button的OnClickListener),然后要求宿主activity实现它。当activity通过这个接口接收到一个回调。接下来看下伪代码

   

public class FragmentA extends Fragment {
  
   public interface IOnChangUI{
       void onChandUI();
   } 

  private IOnChangUI mListener;
    ...
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            mListener = (OnArticleSelectedListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener");
        }
    }
    ...
     @Override
   public void onClick(View view ) { 
        mListener.onArticleSelected(noteUri);
    } 

 }

 
 
 
 
这样接口回调机制实现Fragment和Activity之间的通信就完成了

      二、广播实现通信

      这个实现起来也比较简单,在宿主Activity里面注册广播,当需要通信的时候在Fragment中发送广播,宿主Activity中接受到广播,进行相应处理即可。这种方式比较灵活,也比较简单,没有接口回调那么多接口和处理。Fragment和Activity之间耦合度也较低

     三、使用第三方框架EventBus

     这个可以说是最简单的一种方式,EventBus是专门用于组件间通信的一个开源框架,使用起来也就几行代码的事情,让Fragment和Activity之间没有耦合。但弊端也显而易见,使用框架固然简单,但性能上肯定没有你自己实现高。当就目前设备性能而言,这点性能浪费还是可以接受的。

   

       通信的方式或许还有其他,我自己常用就三种方式。最好还有一点需要提醒大家,无论你使用那种方式,都必须考虑一个问题,Fragment的拓展性,Fragment设计出来的初衷是组件的碎片化,易于复用,千万不要让Fragment和Activity高度耦合,那样Fragment就失去他原本的意义了   






  

你可能感兴趣的:(优化,通信,Activity,Fragment)