• Fragmen和Activity之间的通信--接口和实现的分离(转)


    分类: 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的编程思想还需要不停的学习和体验。
  • 相关阅读:
    解决ubuntu下pip安装报错问题:ERROR: Cannot uninstall 'XXXXXXX'. It is a distutils installed project...
    【IMU】【卡尔曼滤波】惯性导航误差微分方程与状态转移方程
    AspNetCore 路由 <3.0>
    AspNetCore 认证 <1.0>
    AspNetCore 鉴权 <2.0>
    apollo学习2:docker集群部署
    C#中HashSet<T>、SortedSet<T>和Hashtable的使用以及所有集合类型的概述
    Spring自带的Objects等工具类(减少繁琐代码)
    五分钟,手撸一个简单的Spring容器
    jdk1.8: Consumer函数
  • 原文地址:https://www.cnblogs.com/qingchen1984/p/4303746.html
Copyright © 2020-2023  润新知