你需要了解的官方core-ktx庫能對開發帶來哪些便利1

語言: CN / TW / HK

theme: juejin highlight: atelier-heath-light


持續創作,加速成長!這是我參與「掘金日新計劃 · 6 月更文挑戰」的第7天,點選檢視活動詳情

接下來準備出一個系列的文章,專門研究Android官方提供的core-ktx庫裡面的擴充套件類、方法等等,看看能為專案開發帶來哪些便利。

基於core-ktx:1.7.0版本分析

groovy dependencies { implementation 'androidx.core:core-ktx:1.7.0' }

SharedPreferences.edit擴充套件方法

先看下以前我們怎麼往SharedPreferences寫入值的: kotlin private fun test1() { val sp = getSharedPreferences("data", Context.MODE_PRIVATE) val edit = sp.edit() edit.putString("key", "value"); edit.apply() } 有點小麻煩,所以core-ktx提供了SharedPreferences.edit擴充套件方法:

image.png

然後就可以這樣使用:

kotlin private fun test1() { getSharedPreferences("data", Context.MODE_PRIVATE).edit(false) { putString("key", "value") } }

Animator.xxx動畫系列擴充套件

先看下監聽動畫開始、暫停、恢復、取消、結束的程式碼之前是怎麼寫的:

image.png

這個地方實現的是AnimatorListenerAdapter動畫監聽類,這個類其實已經幫助我們對原來的動畫監聽類Animator.AnimatorListener做了一層優化,使得我們只用有選擇性的重寫需要的監聽方法即可。不過這個地方我為了展示,索性就全部進行了重寫。

不過,core-ktx庫為我們提供了Animator.addListener的擴充套件方法:

image.png

使得我們可以這樣實現動畫的監聽方法:

```kotlin private fun test2() { val anim = ValueAnimator.ofInt(0, 100) anim.addListener(onStart = {

}, onEnd = {

}, onRepeat = {

})
anim.start()

} ```

當然了,如果你覺得這樣寫還是很麻煩,比如我只想簡單的監聽下動畫開始或者動畫結束等等,那貼心的core-ktx還提供了下面的擴充套件方法doOnxxx()系列,比如Animator.doOnEnd()Animator.doOnStart()

image.png

然後我們就可以根據需要這樣寫了:

kotlin private fun test2() { val anim = ValueAnimator.ofInt(0, 100) anim.doOnEnd { } anim.doOnStart { } anim.start() }

TextView.doxxx內容監聽擴充套件方法

和上面的動畫提供的擴充套件方法類似,core-ktx對於TextView實現文字內容的監聽也提供了以下幾個方法,分別對應著文字變化前、變化中、變化後的監聽

image.png

這樣我們就不用每次都需要手動構造一個TextWatcher並強制重寫裡面的三個方法來是文字內容監聽了,這裡就不再舉例描述了。

xxx.toUrixxx.toFile擴充套件方法

在這裡,core-ktx提供了更簡單的路徑字串轉uri、檔案轉uri

image.png

同樣還提供了uriFile檔案的擴充套件方法:

image.png

ViewGroup.xxx相關擴充套件方法

  1. 判斷當前ViewGroup是否包含某個子View

    之前的實現方式: kotlin val group = LinearLayout(this) val isContain = group.indexOfChild(view) != -1 core-ktx提供了contains運算子過載擴充套件方法:

    image.png

    我們就可以這樣判斷(contains過載的運算子就是in): kotlin val group = LinearLayout(this) val isContain = view in group

  2. ViewGroup新增一個子View

    傳統的方法是通過addView()實現,不過core-ktx提供了plusAssign()擴充套件函式過載了+=的形式新增子View:

    image.png

    我們就可以在程式碼裡這樣新增子Viewkotlin private fun test3(view: View) { val group = LinearLayout(this) //新增子View group += view }

  3. ViewGroup移除子View

    core-ktx提供了minusAssign()擴充套件函式過載了-=的形式移除子View

    image.png

    然後就可以這樣使用:group -= view

  4. 遍歷ViewGroup中的子View

    core-ktx提供了ViewGroup.iterator()擴充套件函式過載了for in運算子實現遍歷:

    image.png

    就可以這樣使用: kotlin private fun test3() { val group = LinearLayout(this) for (child in group) { //執行操作 } }

  5. 遞迴返回ViewGroup的所有子View

    core-ktx提供了ViewGroup.descendants返回ViewGroup下所有的子View(直接和間接的):

    image.png

    可以看到該擴充套件屬性的返回值是Sequence,相比較於返回List集合,有以下優點:

    對於返回的子View集合進行各種filter、map等操作不會生成中間集合,只會快取中間運算操作,遇到末端運算子如first,才會對集合元素執行真正的操作,所以相比較於List能夠減少中間集合物件的建立,從而減少記憶體的開銷,在一定情況下可以提高執行效率,減少不需要執行的中間運算操作。

最後

core-ktx庫提供的工具方法有很多,本篇文章只是講述了其十分之一左右,接下來會繼續編寫其他文章進行講述。