喜歡直接看代碼的讀者請移步: 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一下,這將是做者莫大的動力。