喜欢直接看代码的读者请移步: Kotlin-TargetFunhtml
随着Kotlin的加入,在安卓开发中写代码变得愈加的简洁和灵活。好比原来的时候用Java书写一个最简单的View的点击事件,代码是这样:git
btn1.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
}
});
复制代码
如今来看,代码真是有些冗余。在kotlin中,多亏其支持lamada表达式,函数参数以及扩展函数,会让代码变变成这样:github
btn1.setOnClickListener {
}
复制代码
然而,面对多函数接口的时候,原生Kotlin并无给出这么简洁的解决方案。想必有些读者有些疑问,啥是多函数接口呢?举个例子更好解释,最多见的就是给EditText这个控件添加个文本变化监听接口TextWatcher,你们对这个接口很熟悉,知道其有3个方法,可是咱们每每只会用其中1-2个方法,用不到的方法也必须列出来。对,最多见的就是这么写:bash
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个方法。。。整个过程既冗余又没有足够智能的提示。ide
针对这种情况,有些读者(包括做者)确定不爽了,因而网上出现了比较常见的两种方式:函数
2.灵活,却不简洁spa
在我看来,要可以简洁的调用相似TextWatcher这种多函数接口,应达到三点:.net
很明显,上面两种方案都达不到。code
说到这里,本文的主角总算出来了,那就是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,其中的扩展函数更是须要统一命名方式,不然当扩展方法多了以后,可能跟官方原生的方法产生误解。
语言有些苍白,来些实际效果让读者能更直观的理解:
TextWatcher
OnSeekBarChangeListener
OnPageChangeListener
AnimatorListener
以上只是少部分该库的运用,想要看更全的介绍或者想在项目中使用本库,请移步至
喜欢或者以为有帮助,请star一下,这将是做者莫大的动力。