Kotlin小利器-TargetFun,讓多函式介面的呼叫更加簡單

Cysion1989發表於2018-12-18

喜歡直接看程式碼的讀者請移步: 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個方法。。。整個過程既冗餘又沒有足夠智慧的提示。

針對這種狀況,有些讀者(包括作者)肯定不爽了,於是網上出現了比較常見的兩種方式:

1.不靈活,多方法混用和修改都無擴充套件性

2.靈活,卻不簡潔

在我看來,要能夠簡潔的呼叫類似TextWatcher這種多函式介面,應達到三點:

  1. 靈活,想呼叫那個方法就用哪個,不需要的則不需要列出;
  2. 簡潔,只寫能真正幹活且易讀的程式碼,其它變數什麼的能省就省;
  3. 提示,能讓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

在這裡插入圖片描述

以上只是少部分該庫的運用,想要看更全的介紹或者想在專案中使用本庫,請移步至

Kotlin-TargetFun

喜歡或者覺得有幫助,請star一下,這將是作者莫大的動力。

相關文章