分类: Android平台

    在平板的开发过程中通常都会采用多个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的编程思想还需要不停的学习和体验。

Fragmen和Activity之间的通信--接口和实现的分离(转)的更多相关文章

  1. Android系列之Fragment(三)----Fragment和Activity之间的通信(含接口回调)

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  2. Fragment的生命周期和Activity之间的通信以及使用

    Fragment通俗来讲就是碎片,不能单独存在,意思就是说必须依附于Activity,一般来说有两种方式把Fragment加到Activity,分为静态,动态. 静态即为右键单击,建立一个Fragme ...

  3. 适配器(adapter)与fragment之间、fragment与activity之间的通信问题

    一.适配器(adapter)与fragment之间通信 通过本地广播进行通信 步骤如下 在adapter中代码 声明本地广播管理 private LocalBroadcastManager local ...

  4. Activity之间的通信

    通常Activity之间的通信有三种方式:单向不传参数通信.单项传参数通信和双向通信. 这几种传递方式都需要通信使者Intent.以下将用代码来辅助理解. 1.单向不传递参数通信 public cla ...

  5. Android中BroadCast与Activity之间的通信

    在看本文之前,假设你对于Android的广播机制不是非常了解.建议先行阅读我转载的一篇博文:图解 Android 广播机制. 因为本案例比較简单,故直接在此贴出代码,不做过多的阐述. 先上效果截图: ...

  6. 【Android 应用开发】Activity生命周期 与 Activity 之间的通信

    一. Activity生命周期 上图 1. Activity状态 激活状态 : Activity出于前台 , 栈顶位置; 暂停状态 : 失去了焦点 , 但是用户仍然可以看到 , 比如弹出一个对话框 , ...

  7. Android中两个Activity之间简单通信

    在Android中,一个界面被称为一个activity,在两个界面之间通信,采用的是使用一个中间传话者(即Intent类)的模式,而不是直接通信. 下面演示如何实现两个activity之间的通信. 信 ...

  8. Activity生命周期 与 Activity 之间的通信

    一. Activity生命周期 上图 1. Activity状态 激活状态 : Activity出于前台 , 栈顶位置; 暂停状态 : 失去了焦点 , 但是用户仍然可以看到 , 比如弹出一个对话框 , ...

  9. Fragment与Activity之间的通信

      我个人将Fragment与Activity间的通信比喻为JSP与Servlet间的通信,fragment中用接口的方式来进行与Activity的通信.通信的结果可以作为数据传入另一个Fragmen ...

随机推荐

  1. 今天开通博客,记录我作为一个小菜鸟在iOS学习中的点点滴滴

    一直以来都是默默的关注各位同仁,没有为网站作什么贡献. 现在借开始学习iOS开发的这个机会开博,集中于介绍这个过程,激励我自己. 谢谢大家!

  2. Head First--设计模式(装饰者模式)

    从现在开始,我将以写一个小软件的方式来进行模式识别的学习,包含需求分析,功能模块设计,原理图设计,程序实现这个几个部分,可能具体的模式模块不可能都包括在内. 需求分析:星巴兹咖啡店已经遍布全世界的很多 ...

  3. QQ登录界面

    @property (nonatomic,assign) IBOutlet UITextField *qq; @property (nonatomic,assign) IBOutlet UITextF ...

  4. linux c中select使用技巧

    1.select函数作为定时器使用    it_value.tv_sec = 0;    it_value.tv_usec = 100000:    select(1,NULL,NULL,NULL,& ...

  5. isr

    Kafaka动态维护了一个同步状态的副本的集合(a set of in-sync replicas),简称ISR

  6. 免费 WebOffice使用

    目前WebOffice使用比较多主要有两个公司的产品,分别是江西金格和北京点聚.但是点聚的是免费的,虽然有欠缺之处,但是经过个人修改还是比较好用的,关键一点是,它免费啊! 把一个最主要加载页面,如果读 ...

  7. block 的演练和使用

    概念 block 是 C 语言的 是一种数据类型,可以当作参数传递 是一组预先准备好的代码,在需要的时候执行 动画 block 回顾 self.demoView.center = CGPointMak ...

  8. 【SQL】SQL

    SQL基础 本文参照:http://www.w3school.com.cn/sql/ SQL 结构化查询语言(Structured Query Language). 对于大小写不敏感. SQL 使用单 ...

  9. 怎样解决VS2013模块对于SAFESEH 映像是不安全的

    今天在使用VS2013编译一个控制台应用程序时出现了:error LNK2026 模块对于 SAFESEH 映像是不安全的,按照以下步骤轻松解决了. 打开该项目的“属性页”对话框,然后单击“链接器”- ...

  10. ACM课程学习总结

    ACM课程学习总结报告 通过一个学期的ACM课程的学习,我学习了到了许多算法方面的知识,感受到了算法知识的精彩与博大,以及算法在解决问题时的巨大作用.此篇ACM课程学习总结报告将从以下方面展开: 学习 ...