前言

开发一个app时,常用Activity和Fragment,由于操作方便Fragment越来越受欢迎,这样就避免不了Activity和Fragment、Fragment和Fragment之间的通信,我们知道Fragment和Fragment之间不能直接进行通信的,而是通过Activity进行通信。那么Activity和Fragment有几种通信方式呢,它们的优缺点又是什么?
一 常用的Activity和Fragment几种通信方式
1 通过Handle
在Activity创建一个Handle机制实例,然后在创建Fragment的通过构造方法把Handle实例传递过去,这样Fragment就可以往Activity传送数据了。但这样如下缺点:
(1)Activity和Fragment之间耦合性增大;
(2)Activity处理后的结果不能实时反馈给Fragment;
(3)提高了内存泄漏风险;
2 使用static变量
缺点很明确增大内存消耗;
3 使用广播
分别在Activity和Fragment中注册广播,这样就可以实现通信了。其缺点:
(1)性能差,有延迟,用户体验就会差;
(2)一般使用的是标准广播,一个发送,多个接收者,大材小用,性能差;
(3)代码冗余;
(4)传播的数据有限;
4 EventBus 、rxBus(俗称万能油)
其使用方法参考官方文档,其优点就是实用起来简单方便,其缺点也很明显:
(1)EventBus 、rxBus其内部使用的是反射机制,那么其性能就会降低;
(2)代码维护困难(不熟悉的项目代码的新人很难找到实现的方法在是如何调用的);
(3)数据返回困难,它们是单向传递;
5 普通接口
在Fragment写一个接口,让Activity去实现这个接口,通过这个接口把Activity与Fragment绑定在一起,这样Activity和Fragment实时进行通信了,其实谷歌推荐就是这么干的,由于每个Fragment都写一个接口,就会造成代码冗余;如果Fragment少的话还好,多的话,Activity实现多个接口,显得Activity头部很大,况且接口的命名也是一个问题;
二 万能接口
如果在5的基础能够解决代码冗余、接口命名就好了,我们知道一个函数包括函数名、函数体、参数、返回值,那么就可以通过搭建一个简单的框架实现上述问题。
 
建立无(有)参数无(有)四类
 
 
定义完所有的接口抽象类之后,我们在定义一个接口管理类,通过接口管理类来管理调用对应的函数方法。

最后在Activity中实现通信:

  1. public class MainActivity extends AppCompatActivity{
  2.  
  3. private ArrayList<Fragment> fragmentArrayList = new ArrayList<>();
  4. private Fragment mCurrentFragment;
  5. private BottomNavigationBar mBottomNavigationBar;
  6. BadgeItem badgeItem;
  7.  
  8. FragmentManager mFragmentManager;
  9.  
  10. @Override
  11. protected void onCreate(Bundle savedInstanceState) {
  12. super.onCreate(savedInstanceState);
  13. setContentView(R.layout.activity_main);
  14. initView();
  15. }
  16.  
  17. private void initView(){
  18. mFragmentManager = getSupportFragmentManager();
  19. initFragemnt();
  20. showFragment(0);
  21. mBottomNavigationBar = (BottomNavigationBar) findViewById(R.id.bottom_navigation_bar);
  22. mBottomNavigationBar.setMode(BottomNavigationBar.MODE_FIXED);
  23. mBottomNavigationBar.setBackgroundStyle(BottomNavigationBar.BACKGROUND_STYLE_STATIC);
  24. mBottomNavigationBar.setBarBackgroundColor(android.R.color.white);
  25. badgeItem = new BadgeItem()
  26. .setBackgroundColor(Color.RED).setText("99")
  27. .setHideOnSelect(true); //设置被选中时隐藏角标
  28. mBottomNavigationBar
  29. .setActiveColor(R.color.colorAccent) //设置选中的颜色
  30. .setInActiveColor(R.color.colorPrimary);//未选中
  31.  
  32. mBottomNavigationBar.addItem(new BottomNavigationItem(R.mipmap.ic_launcher, "首页"))
  33. .addItem(new BottomNavigationItem(R.mipmap.ic_launcher, "店铺"))
  34. .addItem(new BottomNavigationItem(R.mipmap.ic_launcher, "购物车"))
  35. .addItem(new BottomNavigationItem(R.mipmap.ic_launcher, "我的").setBadgeItem(badgeItem))
  36. .initialise();
  37. mBottomNavigationBar.setTabSelectedListener(new BottomNavigationBar.OnTabSelectedListener(){
  38.  
  39. @Override
  40. public void onTabSelected(int position) {
  41. showFragment(position);
  42. }
  43.  
  44. @Override
  45. public void onTabUnselected(int position) {
  46.  
  47. }
  48.  
  49. @Override
  50. public void onTabReselected(int position) {
  51.  
  52. }
  53. });
  54.  
  55. }
  56.  
  57. private void showFragment(int page) {
  58. FragmentTransaction mFragmentTransaction = mFragmentManager
  59. .beginTransaction();
  60. if (mCurrentFragment != null) {
  61. mFragmentTransaction.hide(mCurrentFragment);
  62. }
  63. mCurrentFragment = fragmentArrayList.get(page);
  64. if (mCurrentFragment.isAdded())
  65. {
  66. mFragmentTransaction.show(mCurrentFragment);
  67. }else {
  68. mFragmentTransaction.add(R.id.fragmenta, mCurrentFragment,mCurrentFragment.getClass().getName());
  69. }
  70. mFragmentTransaction.commitAllowingStateLoss();
  71. }
  72.  
  73. private void initFragemnt(){
  74. fragmentArrayList.add(new A());
  75. fragmentArrayList.add(new B());
  76. fragmentArrayList.add(new C());
  77. fragmentArrayList.add(new D());
  78. }
  79.  
  80. public void setFunctionForFragment(final String tag){
  81. BaseFragment fragment=(BaseFragment)mFragmentManager.findFragmentByTag(tag);
  82. FunctionManager functionManager=FunctionManager.getInstance();
  83. fragment.setmFunctionManager(functionManager.addFunction(new FunctionNoParamNotResult(A.INTERFCE) {
  84. @Override
  85. public void function() {
  86. Toast.makeText(MainActivity.this,"无参无返回值"+tag,Toast.LENGTH_LONG).show();
  87. }
  88. }).addFunction(new FunctionNoParamWithResult<String>(B.INTERFCE) {
  89. @Override
  90. public String function() {
  91. Toast.makeText(MainActivity.this,"无参有返回值",Toast.LENGTH_LONG).show();
  92. return "张三";
  93. }
  94. }).addFunction(new FunctionWithParamNoResult<Integer>(C.INTERFCE) {
  95. @Override
  96. public void function(Integer o) {
  97. Toast.makeText(MainActivity.this,"有参无返回值"+o,Toast.LENGTH_LONG).show();
  98. }
  99. }).addFunction(new FunctionWithParamResultn<String>(D.INTERFCE) {
  100. @Override
  101. public String function(String o) {
  102. Toast.makeText(MainActivity.this,"有参有返回值"+o,Toast.LENGTH_LONG).show();
  103. return "zhangqie";
  104. }
  105. }));
  106. }
  107.  
  108. }

效果图:

源码下载Github:https://github.com/DickyQie/android-fragment-interface

 

android--------实现Activity和Fragment通信的面向对象的万能接口的更多相关文章

  1. 架构师成长之路-基于android fragment通信的面向对象的万能接口

    前言 开发一个app时,常用Activity和Fragment,由于操作方便Fragment越来越受欢迎,这样就避免不了Activity和Fragment.Fragment和Fragment之间的通信 ...

  2. Android之Activity与Service通信

    一.当Acitivity和Service处于同一个Application和进程时,通过继承Binder类来实现. 当一个Activity绑定到一个Service上时,它负责维护Service实例的引用 ...

  3. 从Android中Activity之间的通信说开来[转]

    http://www.cnblogs.com/virusswb/archive/2011/08/02/2124824.html 引言 最近两个星期在研究android的应用开发,学习了android应 ...

  4. Android中Activity加入Fragment使用注意事项及常用技巧

    Fragment中AlertDialog弹出窗口的使用 Fragment默认不具有Content的一些方法和属性,因此在Activity中可以使用的一些方法在Fragment中使用就需要一些小技巧了 ...

  5. 【android】activity、fragment传值例子

    1:Activity篇 1.1向Activity传值 关键点在于putExtra.如果传递类的话,记得类实现Serializable接口 Intent intent = new Intent(Firs ...

  6. Android之Activity与fragment完整生命周期图

    转自:https://github.com/xxv/android-lifecycle

  7. Android:手把手教你 实现Activity 与 Fragment 相互通信,发送字符串信息(含Demo)

    前言Activity 与 Fragment 的使用在Android开发中非常多今天,我将主要讲解 Activity 与 Fragment 如何进行通信,实际上是要解决两个问题: Activity 如何 ...

  8. Android 数据传递(二)Activity与fragment之间的通信

    在网上找到了一篇总结的非常好的文章,我这里就贴出他的博文地址.自己就不再写这个方面的总结了. Activity与Fragment通信(99%)完美解决方案

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

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

随机推荐

  1. 解决Win10 Git图标不显示问题

    升级系统到win10 1803版本以后发现TortoiseGit的忽略图标不显示了 开始以为是版本问题,将TortoiseGit版本进行了升级还是不行 网上查找以后发现 Windows Explore ...

  2. 【做题】CF119D. String Transformation——KMP

    题意:有两个字符串\(a,b\),下标从\(0\)开始.求数对\((i,j)\)满足\(a[i+1:j] + r(a[j:n]) + r(a[0:i+1]) = b\),其中\(r(s)\)表示字符串 ...

  3. ssm项目部署到服务器过程

    ssm项目部署到服务器过程 特别篇 由于准备春招,所以希望各位看客方便的话,能去github上面帮我Star一下项目 https://github.com/Draymonders/Campus-Sho ...

  4. P4492 [HAOI2018]苹果树

    思路 题目要求的其实就是每种方案的权值之和(因为每种方案的概率相等) 所以自然想到要求所有的边对最终答案的贡献次数 考虑这一条边被经过了多少次,有这个子树内的点数*子树外的点数次,即\(k\times ...

  5. Unsupervised Image-to-Image Translation Networks --- Reading Writing

    Unsupervised Image-to-Image Translation Networks --- Reading Writing 2017.03.03 Motivations: most ex ...

  6. PTA 输出全排列(20 分)

    7-2 输出全排列(20 分) 请编写程序输出前n个正整数的全排列(n<10),并通过9个测试用例(即n从1到9)观察n逐步增大时程序的运行时间. 输入格式: 输入给出正整数n(<10). ...

  7. Leetcode122-Best Time to Buy and Sell Stock II-Easy

    Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...

  8. HDU 3526 Computer Assembling(最小割)

    http://acm.hdu.edu.cn/showproblem.php?pid=3526 题意:有个屌丝要配置电脑,现在有n个配件需要购买,有两家公司出售这n个配件,还有m个条件是如果配件x和配件 ...

  9. Java的反射机制Reflect

    简介: 动态获取类的信息.动态调用对象的方法的功能叫做:Java 的反射(Reflection)机制. Reflection是不同于C++等静态语言,而被视为准动态语言的关键性质.反射机制允许程序在运 ...

  10. OpenLayers中的球面墨卡托投影

    最近看OpenLayers,研究到地图投影时找到官方的文档,就翻译了一下,由于英文能力差,翻译不好的地方,请看原文 原文地址:http://docs.openlayers.org/library/sp ...