喜歡直接看程式碼的讀者請移步: Kotlin-TargetFun
隨著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個方法。。。整個過程既冗餘又沒有足夠智慧的提示。
針對這種狀況,有些讀者(包括作者)肯定不爽了,於是網上出現了比較常見的兩種方式:
在我看來,要能夠簡潔的呼叫類似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
OnSeekBarChangeListener
OnPageChangeListener
AnimatorListener
以上只是少部分該庫的運用,想要看更全的介紹或者想在專案中使用本庫,請移步至
喜歡或者覺得有幫助,請star一下,這將是作者莫大的動力。