Kotlin小利器,让多函数接口的调用更加简单
Posted 安卓巴士Android开发者门户
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)
以上只是少部分该库的运用,想要看更全的介绍或者想在项目中使用本库,请移步至
https://github.com/CysionLiu/kotlin-targetFun
喜欢或者觉得有帮助,请star一下,这将是作者莫大的动力。
大家都在看
欢迎前往安卓巴士博客区投稿,技术成长于分享
期待巴友留言,共同探讨学习
以上是关于Kotlin小利器,让多函数接口的调用更加简单的主要内容,如果未能解决你的问题,请参考以下文章