Kotlin小利器,让多函数接口的调用更加简单

随着Kotlin的加入,在安卓开发中写代码变得越发的简洁和灵活。比如原来的时候用Java书写一个最简单的View的点击事件,代码是这样:

 btn1.setOnClickListener(new OnClickListener(){
            public void onClick(View v) {
       
            }
  });

现在来看,代码真是有些冗余。在kotlin中,多亏其支持lamada表达式,函数参数以及扩展函数,会让代码变变成这样:

 btn1.setOnClickListener { 

 }

然而,面对多函数接口的时候,原生Kotlin并没有给出这么简洁的解决方案。想必有些读者有些疑问,啥是多函数接口呢?举个例子更好解释,最常见的就是给EditText这个控件添加个文本变化监听接口TextWatcher,大家对这个接口很熟悉,知道其有3个方法,但是我们往往只会用其中1-2个方法,用不到的方法也必须列出来。对,最常见的就是这么写:

EditText(this).addTextChangedListener(object :TextWatcher{
            override fun afterTextChanged(s: Editable?) {
            }

            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
            }

            override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
            }
        })

上面这种写法真是太像Java了,不只如此,目前IDE还不能给出比较智能的提示,当写addTextChangedListener()方法时,IDE只提示要传入个TextWatcher,然而怎么传却不知道,我想刚接触这块的读者,肯定会百度一番,发现需要传入个object :TextWatcher,这时候肯定还不算传入成功,然而,IDE却仍不能给出足够的提示,还需要手动再把{}输入,才会在object上出现提示,让全部实现接口的3个方法。。。整个过程既冗余又没有足够智能的提示。

针对这种状况,有些读者(包括作者)肯定不爽了,于是网上出现了比较常见的两种方式:

1.不灵活,多方法混用和修改都无扩展性

2.灵活,却不简洁

在我看来,要能够简洁的调用类似TextWatcher这种多函数接口,应达到三点:

灵活,想调用那个方法就用哪个,不需要的则不需要列出;
简洁,只写能真正干活且易读的代码,其它变量什么的能省就省;
提示,能让IDE足够智能的提示出接下来代码该怎么写。
很明显,上面两种方案都达不到。

说到这里,本文的主角总算出来了,那就是Kotlin-TargetFun,这个库专为简化多函数接口而生,语言苍白,还是代码比较有表达力。当用这个库时,你可以这样为EditText添加监听:

EditText(this)._addTextChangedListener {
        _onTextChanged { s, start, before, count ->

        }
    }

或者这样

EditText(this)._addTextChangedListener {
        _beforeTextChanged { s, start, count, after ->

        }
        _onTextChanged { s, start, before, count ->

        }
    }

或者这样

 EditText(this)._addTextChangedListener {
        _onTextChanged { s, start, before, count ->

        }
        _afterTextChanged {

        }
    }

这时候再来看是否能达到上面说的三点要求:

灵活,想用哪个方法就写哪个;

简洁,除了必须要写的方法名就只有{}了;

提示,所有方法名字都以 _ 开头,这让IDE有足够的上下文去推断下面该做什么;

这里需要声明,Java开发规范中,一般不让方法名中出现 _,但,这是灵活的kotlin,其中的扩展函数更是需要统一命名方式,否则当扩展方法多了之后,可能跟官方原生的方法产生误解。

目前TargetFun支持的多函数接口如下

TextWatcher
ViewPager.OnPageChangeListener
Animator.AnimatorListener
AbsListView.OnScrollListener
RecyclerView.OnScrollListener
SeekBar.OnSeekBarChangeListener
View.OnAttachStateChangeListener
DrawerLayout.DrawerListener
View.OnClickListener(filter)
Observer (rx)
FlowableSubscriber (rx)
一些彩蛋(๑◡๑)
语言有些苍白,来些实际效果让读者能更直观的理解:

TextWatcher
在这里插入图片描述

OnPageChangeListener
在这里插入图片描述

OnSeekBarChangeListener

在这里插入图片描述
AnimatorListener

在这里插入图片描述

Observer
在这里插入图片描述

彩蛋

Edittext的扩展函数,打开/关闭键盘

EditText(this).openKeyBoard()

EditText(this).hideKeyBoard()

过滤频繁点击

Button(this)._setOnClickListener {
    }

跳转Activity,1000请求码

_startActivityForResult<EditExActivity>(1000)

_startActivity<EditExActivity>()

str(resid), drawable(resid)等方法

TextView(this).text=str(R.string.app_name)

免费获取安卓开发架构的资料(包括高级UI、性能优化、架构师课程、 NDK、混合式开发(ReactNative+Weex)和一线互联网公司关于android面试的题目汇总可以加群:936332305 / 群链接:点击链接加入群聊【安卓开发架构】:https://jq.qq.com/?_wv=1027&k=515xp64

以上只是少部分该库的运用,想要看更全的介绍或者想在项目中使用本库,请移步至

https://github.com/CysionLiu/kotlin-targetFun

猜你喜欢

转载自blog.csdn.net/Coo123_/article/details/85322335