隆重推出:Android KTX 預覽版讓 Kotlin 代碼更精簡

這裏寫圖片描述

最近逛官網發現Android KTX ,Android KTX 是一套擴展插件。它能幫助開發者更爲簡潔、通順和優雅地使用 Kotlin 語言開發 Android 應用。目前版本0.2,Google 表示,預覽期間 API 可能會發生改變,目前不建議開發者在主要 Android 項目中使用。當 API 穩定且 Google 承諾 API 兼容性時,Android KTX 將作爲 Android 支持庫的一部分發布。趁有空趕緊look

相關鏈接

android-ktx github 點我
android-ktx api doc 點我

Android KTX

Android應用程序開發的一套Kotlin擴展。 Android KTX的目標是通過Kotlin使Android開發更加簡潔,愉快和習慣。 這個項目的明確目標是不向現有Android API添加任何新功能.Android KTX

使用

要將Android KTX添加到您的項目中,請將以下內容添加到您的應用模塊的build.gradle中:

repositories {
    google()
}

dependencies {
    implementation 'androidx.core:core-ktx:0.2'
}

官方一個例子
Kotlin:

sharedPreferences.edit()
    .putBoolean("key", value)
    .apply()

Kotlin with Android KTX:

sharedPreferences.edit {
    putBoolean("key", value)
}

對於熟悉 kotlin 擴展 的童鞋,十分簡單。下面讓我們看看它有什麼好東西。

animation
content
database
graphics
net
os
preference
text
transition
util
view
widget

以上的是現在的目錄結構,包分得十分清晰

Animator.kt 擴展了Animator 各種事件回調

addPauseListener
addListener
doOnPause
doOnResume
doOnCancel
doOnRepeat
doOnStart
doOnEnd

若不封裝Animator.AnimatorListener 如下冗餘

animator.addListener(object:Animator.AnimatorListener {
            override fun onAnimationRepeat(p0: Animator?) {
            }

            override fun onAnimationEnd(p0: Animator?) {
            }

            override fun onAnimationCancel(p0: Animator?) {
            }

            override fun onAnimationStart(p0: Animator?) {
            }

        })

簡潔的Animator監聽

animator = ObjectAnimator.ofFloat(fab, "alpha", 1f, 0.1f, 1f)
animator.duration = 2000
animator.doOnStart {
    Log.d(TAG,"doOnStart")
}
animator.doOnEnd {
    Log.d(TAG,"doOnEnd")
}
animator.addListener(onCancel = {
    Log.d(TAG,"onCancel")
})
animator.start()

TypedArray.kt 擴展了原來獲取各種屬性值的api,沒有該屬性直接 throw IllegalArgumentException("Attribute not defined in set.")

ContentValues.kt 中contentValuesOf 函數通過一組鍵值對生成一個新的ContentValues 對象

Log.d(TAG,"hello ${contentValuesOf(Pair("name","ktx"))["name"]}")

Context.kt 擴展了一個通過class獲取系統級別 service 的函數 systemService() ,實則是調用 Context.getSystemService()

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
    val windowManager = systemService<WindowManager>() vs = getSystemService(WindowManager::class.java)
}

沒錯正是內聯函數能有具體化的類型參數(Reified type parameters),用 reified 修飾符來限定類型參數。另外還擴展了withStyledAttributes() 實則調用obtainStyledAttributes 後釋放 typedArray

SharedPreferences.kt 擴展了 edit(commit: Boolean = false,action: SharedPreferences.Editor.() -> Unit) 函數,正是高階函數(將函數用作參數或返回值的函數)。下面看看的實現

@SuppressLint("ApplySharedPref")
inline fun SharedPreferences.edit(
    commit: Boolean = false, //默認是apply 操作
    action: SharedPreferences.Editor.() -> Unit //接收action 匿名函數以Editor爲參數的
) {
    val editor = edit()
    editor.action()// or action(editor)  調用函數
    if (commit) {
        editor.commit()
    } else {
        editor.apply()
    }
}
preferences.edit {
//能直接使用類的成員函數或擴展函數且限定
    putString("test_key1", "test_value")
    putInt("test_key2", 100)
}

利用kotlin 特性能減少千篇一律的代碼,如數據庫開始事務,提交事務,我們更多關心的是操作數據部分。如 SQLiteDatabase.kt 擴展SQLiteDatabase,原理一樣,不說了。 我認爲Android KTX 少了Fragment 事務的封裝

inline fun FragmentManager.inTransaction(func: FragmentTransaction.() -> FragmentTransaction) {
    beginTransaction().func().commitAllowingStateLoss()
}

inline fun Fragment.inTransaction(func: FragmentTransaction.() -> FragmentTransaction) {
    this.fragmentManager?.inTransaction(func)
}

inline fun Fragment.inChildTransaction(func: FragmentTransaction.() -> FragmentTransaction) {
    this.childFragmentManager?.inTransaction(func)
}

inline fun FragmentActivity.inTransaction(func: FragmentTransaction.() -> FragmentTransaction) {
    this.supportFragmentManager?.inTransaction(func)
}

參考鏈接
https://medium.com/thoughts-overflow/how-to-add-a-fragment-in-kotlin-way-73203c5a450b

Cursor.kt 封裝了大量通過Cursor獲取value 的方法

BitmapDrawable.kt 擴展了Bitmap 直接轉換 BitmapDrawable

inline fun Bitmap.toDrawable(resources: Resources) = BitmapDrawable(resources, this)

graphics 下還擴展了各種簡潔的繪圖api ,有興趣可以自行研究

Uri.kt 擴展了“反轉”創建uri 統一資源符對象的函數

val intent = Intent(Intent.ACTION_DIAL)
intent.data = "tel:110".toUri()  //字符串轉 uri
startActivity(intent)

os 下擴展了常用的系統組件的api,如常用的Bundle,Handler
..

preference下擴展了常用的preference View
..

text 下擴展了常用的 String /CharSequence /SpannableStringBuilder api
..

transition 下擴展了Transition(過渡動畫) api.
..

util 下擴展了各種工具類,如ArrayMap.kt、ArraySet.kt、Size.kt、SparseArray.kt 、Pair.kt 等
..

view下擴展View,ViewGroup,Menu類

 view.isInvisible = true //vs view.visibility = View.VISIBLE
 ...

Kotlin 的確能讓Android API 變得簡潔

widget下擴展Toast類

另外 Anko 框架也對Android 作出很多的擴展

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章