android--------实现Activity和Fragment通信的面向对象的万能接口

笛里谁知壮士心,沙头空照征人骨。这篇文章主要讲述android--------实现Activity和Fragment通信的面向对象的万能接口相关的知识,希望能为你提供帮助。
前言
开发一个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的基础能够解决代码冗余、接口命名就好了,我们知道一个函数包括函数名、函数体、参数、返回值,那么就可以通过搭建一个简单的框架实现上述问题。   建立无(有)参数无(有)四类  

android--------实现Activity和Fragment通信的面向对象的万能接口

文章图片
  定义完所有的接口抽象类之后,我们在定义一个接口管理类,通过接口管理类来管理调用对应的函数方法。 
【android--------实现Activity和Fragment通信的面向对象的万能接口】 
最后在Activity中实现通信:
public class MainActivity extends AppCompatActivity{private ArrayList< Fragment> fragmentArrayList = new ArrayList< > (); private Fragment mCurrentFragment; private BottomNavigationBar mBottomNavigationBar; BadgeItem badgeItem; FragmentManager mFragmentManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); }private void initView(){ mFragmentManager = getSupportFragmentManager(); initFragemnt(); showFragment(0); mBottomNavigationBar = (BottomNavigationBar) findViewById(R.id.bottom_navigation_bar); mBottomNavigationBar.setMode(BottomNavigationBar.MODE_FIXED); mBottomNavigationBar.setBackgroundStyle(BottomNavigationBar.BACKGROUND_STYLE_STATIC); mBottomNavigationBar.setBarBackgroundColor(android.R.color.white); badgeItem = new BadgeItem() .setBackgroundColor(Color.RED).setText("99") .setHideOnSelect(true); //设置被选中时隐藏角标 mBottomNavigationBar .setActiveColor(R.color.colorAccent) //设置选中的颜色 .setInActiveColor(R.color.colorPrimary); //未选中mBottomNavigationBar.addItem(new BottomNavigationItem(R.mipmap.ic_launcher, "首页")) .addItem(new BottomNavigationItem(R.mipmap.ic_launcher, "店铺")) .addItem(new BottomNavigationItem(R.mipmap.ic_launcher, "购物车")) .addItem(new BottomNavigationItem(R.mipmap.ic_launcher, "我的").setBadgeItem(badgeItem)) .initialise(); mBottomNavigationBar.setTabSelectedListener(new BottomNavigationBar.OnTabSelectedListener(){@Override public void onTabSelected(int position) { showFragment(position); }@Override public void onTabUnselected(int position) {}@Override public void onTabReselected(int position) {} }); }private void showFragment(int page) { FragmentTransaction mFragmentTransaction = mFragmentManager .beginTransaction(); if (mCurrentFragment != null) { mFragmentTransaction.hide(mCurrentFragment); } mCurrentFragment = fragmentArrayList.get(page); if (mCurrentFragment.isAdded()) { mFragmentTransaction.show(mCurrentFragment); }else { mFragmentTransaction.add(R.id.fragmenta, mCurrentFragment,mCurrentFragment.getClass().getName()); } mFragmentTransaction.commitAllowingStateLoss(); }private void initFragemnt(){ fragmentArrayList.add(new A()); fragmentArrayList.add(new B()); fragmentArrayList.add(new C()); fragmentArrayList.add(new D()); }public void setFunctionForFragment(final String tag){ BaseFragment fragment=(BaseFragment)mFragmentManager.findFragmentByTag(tag); FunctionManager functionManager=FunctionManager.getInstance(); fragment.setmFunctionManager(functionManager.addFunction(new FunctionNoParamNotResult(A.INTERFCE) { @Override public void function() { Toast.makeText(MainActivity.this,"无参无返回值"+tag,Toast.LENGTH_LONG).show(); } }).addFunction(new FunctionNoParamWithResult< String> (B.INTERFCE) { @Override public String function() { Toast.makeText(MainActivity.this,"无参有返回值",Toast.LENGTH_LONG).show(); return "张三"; } }).addFunction(new FunctionWithParamNoResult< Integer> (C.INTERFCE) { @Override public void function(Integer o) { Toast.makeText(MainActivity.this,"有参无返回值"+o,Toast.LENGTH_LONG).show(); } }).addFunction(new FunctionWithParamResultn< String> (D.INTERFCE) { @Override public String function(String o) { Toast.makeText(MainActivity.this,"有参有返回值"+o,Toast.LENGTH_LONG).show(); return "zhangqie"; } })); }}

 
效果图:
 
             
android--------实现Activity和Fragment通信的面向对象的万能接口

文章图片

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

    推荐阅读