• 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的基础能够解决代码冗余、接口命名就好了,我们知道一个函数包括函数名、函数体、参数、返回值,那么就可以通过搭建一个简单的框架实现上述问题。
     
    建立无(有)参数无(有)四类
     
     
    定义完所有的接口抽象类之后,我们在定义一个接口管理类,通过接口管理类来管理调用对应的函数方法。

    最后在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";
                }
            }));
        }
    
    }

    效果图:

           

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

     
  • 相关阅读:
    java Future模式的使用
    Objects源码解析
    VUE优秀的组件库总结
    数据库的一致性读,赃读,多线程与赃读,ACID,UNDO
    线程基础,多线程架构,高并发,线程安全基础知识
    程序员必备的开发利器
    spring security 实现登录验证码及记住我
    springboot 集成 spring security 自定义登录
    ELK整合SpringBoot日志收集
    ElasticSearch整合SpringBoot的API操作
  • 原文地址:https://www.cnblogs.com/zhangqie/p/8587703.html
Copyright © 2020-2023  润新知