Kotlin小利器-TargetFun,讓多函數接口的調用更加簡單

喜歡直接看代碼的讀者請移步: 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

針對這種情況,有些讀者(包括做者)確定不爽了,因而網上出現了比較常見的兩種方式:函數

1.不靈活,多方法混用和修改都無擴展性this

2.靈活,卻不簡潔spa

在我看來,要可以簡潔的調用相似TextWatcher這種多函數接口,應達到三點:.net

  1. 靈活,想調用那個方法就用哪一個,不須要的則不須要列出;
  2. 簡潔,只寫能真正幹活且易讀的代碼,其它變量什麼的能省就省;
  3. 提示,能讓IDE足夠智能的提示出接下來代碼該怎麼寫。

很明顯,上面兩種方案都達不到。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,其中的擴展函數更是須要統一命名方式,不然當擴展方法多了以後,可能跟官方原生的方法產生誤解。

目前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一下,這將是做者莫大的動力。

相關文章
相關標籤/搜索