Fragmen和Activity之间的通信--接口和实现的分离

简介:     在平板的开发过程中通常都会采用多个Fragment的实现方式,通常有一个为list的Fragment,以及一个detail的Fragment的形式,这种实现方式通常被称为Master-Detail的模式。
    在平板的开发过程中通常都会采用多个Fragment的实现方式,通常有一个为list的Fragment,以及一个detail的Fragment的形式,这种实现方式通常被称为Master-Detail的模式。

    通常在Master所有的Fragment中需要使能Detail中的Fragemt,因此可以采用在Master中的Fragment直接启动对应的detail Fragment。如下所示:
Fragment fragment = DetailFragment.newInstrance();
FragmentManager fm = getAvtivity()。getFragmentManager ();
fm.beginTransaction()
    .add(R.id.detailFragmentContainer)
    .commit();
    这种方式就使得两个Fragment之间形成了明显的依赖关系,而实际上两个Fragment并没有占用关系,Activity是Fragment的实际占有者,因此最合适的方式是在Activity中完成对应Fragment的添加,而对应的Master Fragment只是起到了发起者,真正的执行着为Activity。
    因此经常采用Fragment中声明具体的接口Callbacks,而在对应的Activity中实现该接口,Fragment通过保存Activity的引用,而调用具体的实现。Activity在该接口的实现中起到具体的Detail Fragment,这样两个Fragment之间的耦合性减少了。进而实现了两个Fragment的通信。因此在同一个Activity的Fragment可以通过这种声明接口,让Activity实现的方式实现Fragment之间的通信。
  Master----->Activty------->Detail
        
    根据上述的分析所述,Fragmen声明接口,而Activity实现对应的接口,因此Activity的对象就是一个该接口的变量,因此在Fragment中要使用该接口的方法,首先需要获取到Activty的引用。关于Fragment如何获取Activity的引用可以采用如下的方式,在Fragment与Activity绑定的过程中会传递一个Activity的参数,如下所示 public void onAttach(Activity activity)。因此可以该函数中初始化Fragment中的mCallbacks变量,该变量即在Fragment中声明的接口对象。同时在Fragment中也可以使用在Activity中实现的方法。实现了声明与定义分离开来的方法。

在Fragment中声明如下的方式:
public class MasterFragment extends Fragment {
     ...    
    Callbacks mcallbacks;
    ...
     Interface Callbacks {
        startDetailFragment(/*可以传递参数*/);
     };
     ...
    
     /* 使用对应的接口 */
    mcallbacks.startDetailFragment();
    ...

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        mcallbacks = (Callbacks)activity;
    }

    @Override
     public void onDetach() {
          super.onDetach();
          mcallbacks = null;
    }
    ...
}

    而在对应的Activity中则只需要实现对应的接口即可:
public class TabActivity extends FragmentActivity implements MasterFragment.Callbacks  {
    ...
    startDetailFragment() {
        /* 实现具体的启动操作 */
    }
    ...
}

    为了实现在两个不同Fragment之间的通信,因此只需要在两个Fragment中备份实现具体的Interface,而在Activity中实现具体的接口,就能实现两个Fragment之间的通信, 代码框架如下所示:
class MasterFragment extends ListFragemt {
    CallBacks mCallBacks;
   
    interface CallBacks {
        /* 启动对应的Fragment */
        void startDetailFragment ();
        /* 应答对应Fragment的请求 */
        void responseDetailFragment();
    };
};
class DetailFragment extends Fragemt {
    CallBacks mCallBacks;
   
    inerface CallBacks {
        void sendRequestToMaster();
    };
};
class Master_Detai_Activity extends Activity
implements DetailFragment.CallBacks MasterFragment.CallBacks {
    void startDetailFragment () {
        /* 创建DetailFragment */
    }
   
    void responseDetailFragment() {
        /* 对DetailFragment进行应答 */
    }
   
    void sendRequestToMaster() {
        /* 往MasterFragment发送请求 */
    }
}

    关于Fragment中使用Activity的参数,是采用了之前使用的Argument实现,通过在创建该Fragment的过程中显示的调用setArguments()。
    Bundle bundle = new Bundle();
    /* 该参数为Activity为Fragment传递的参数 */
    bundle.putSerializable(ID, Id);
    DetailFragment fragment = new DetailFragment ();
    fragment.setArguments(bundle);

    关于Fragment之间的通信方式,主要采用了接口定义与实现接口分离的方式,这种方式简化了Fragment与Activty的通信,Fragment只负责调用接口发送相关的处理,而Activty则对占用的Fragment进行关系,实现具体的接口。Java的编程思想还需要不停的学习和体验。
相关文章
|
22天前
|
设计模式 算法 测试技术
C++ 创建兼容多个IPC机制的上层接口
C++ 创建兼容多个IPC机制的上层接口
27 1
|
9月前
|
Android开发
浅谈组件之间的通信—EventBus
EventBus是一款针对Andoid优化的发布/订阅事件总线,主要功能是替Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息,优点是开销小,代码更优雅,以及将发送者和接收者进行解耦
|
JSON JavaScript 小程序
【小程序】组件通信
【小程序】组件通信
168 0
【小程序】组件通信
|
Java API Kotlin
教你用更好的方式在Activity或Fragment之间传递以及返回数据
教你用更好的方式在Activity或Fragment之间传递以及返回数据
258 0
教你用更好的方式在Activity或Fragment之间传递以及返回数据
|
存储 API
页面之间的通信
页面之间的通信
|
容器
Fragment与Fragment相互切换之间的生命周期方法
最近一段时间忙于找工作,找到工作之后忙于项目上线,好久没有写过博客,现在感觉终于闲暇了,写一写这次项目中需要总结提炼的知识点,给自己留个印象吧,毕竟好记性不如烂笔头。
1531 0
|
XML Android开发 数据格式
Fragment与Activity之间的通信
前言 君子博学而日参省乎已,则知明而行无过矣。 要显示Fragment,必须将Fragment添加到Activity中。添加到Activity中有如下两种方式。
1134 0