Android-KTX
介绍:这是一套用于Android应用开发的 Kotlin 扩展。目的就是为了让我们使用 Kotlin 进行简洁、愉悦、惯用地 Android 开发,而不会增加新的功能。
原理介绍
透过现象看本质,这样使用起来就不会迷惑,而且遇到问题也能方便排查。
Android-ktx主要使用Kotlin语言的几个特性,了解了这些特性后,我们自己也能很方便的进行封装,这样就形成了我们自己的类库,便于自己技术的沉淀。
Extensions
上面的第一个例子,uri的封装就是利用了这个,Kotlin的官方文档也有介绍。
直接看源码就行了。
inline fun String.toUri(): Uri = Uri.parse(this)
其实就是对String做了一个扩展,如果使用Java的就很容易理解,如下所示,这种方式在日常开发中也很容易见到。
public class StringUtil{ public static Uri parse(String uriString) { return Uri.parse(uriString); } }
Lambdas
第二个例子主要使用了Lambdas这个特性,Kotlin文档在这里。
还是贴代码,首先对SharedPreferences做了扩展,然后这个扩展函数的参数是一个闭包,当函数最后一个参数是闭包的时候,函数的括号可以直接省略,然后在后面接上闭包就行了。
inline fun SharedPreferences.edit(action: SharedPreferences.Editor.() -> Unit) { val editor = edit() action(editor) editor.apply() }
Default Arguments
这个特性上面的例子没有,可以单独列举,如下所示。(官方文档介绍)
也是就说,当一个函数中含有多个参数时候,不需要像Java中那样,依次赋值,可以仅仅赋需要的即可,Java中常见的解决的方法是方法重载,挨个传入默认值。
class ViewTest { private val context = InstrumentationRegistry.getContext() private val view = View(context) @Test fun updatePadding() { view.updatePadding(top = 10, right = 20) assertEquals(0, view.paddingLeft) assertEquals(10, view.paddingTop) assertEquals(20, view.paddingRight) assertEquals(0, view.paddingBottom) } }
看updatePadding方法定义。
fun View.updatePadding( @Px left: Int = paddingLeft, @Px top: Int = paddingTop, @Px right: Int = paddingRight, @Px bottom: Int = paddingBottom ) { setPadding(left, top, right, bottom) }
对于默认参数,还可以这样玩,比如在Java中,常见的有建造在模式,对每个参数进行赋值,然后创建一个对象,如果使用这种特性,不需要改变的值,可以直接用默认值表示,这样在编码的时候,就会显得很简洁。
优势:
作为Android开发语言,kotlin本身就是一门非常简洁的开发语言,而Android-KTX使得kotlin更加的简洁,代码更加的精简。
我们可以看到官方给出的一组对比:
Kotlin:
val uri = Uri.parse(myUriString)
Kotlin with Android KTX:
val uri = myUriString.toUri()
Kotlin:
sharedPreferences.edit() .putBoolean("key", value) .apply()
Kotlin with Android KTX:
sharedPreferences.edit { putBoolean("key", value) }
Kotlin:
val pathDifference = Path(myPath1).apply { op(myPath2, Path.Op.DIFFERENCE) } canvas.apply { val checkpoint = save() translate(0F, 100F) drawPath(pathDifference, myPaint) restoreToCount(checkpoint) }
Kotlin with Android KTX:
val pathDifference = myPath1 - myPath2 canvas.withTranslation(y = 100F) { drawPath(pathDifference, myPaint) }
Kotlin:
view.viewTreeObserver.addOnPreDrawListener( object : ViewTreeObserver.OnPreDrawListener { override fun onPreDraw(): Boolean { viewTreeObserver.removeOnPreDrawListener(this) actionToBeTriggered() return true } })
Kotlin with Android KTX:
view.doOnPreDraw { actionToBeTriggered() }
非常明显的可以看出,Android-KTX使得代码更加的简洁。
Android-KTX在Android框架和支持库上提供了一个良好的API层,这使得代码更加简洁,Android-KTX中支持的Android框架的部分现在可在GitHub库中找到,同时,Google承诺在即将到来的支持库版本中提供涵盖Android支持库的Android-KTX其他部分。
注意:
这个库并不是最终正式版本,可能会有API的规范性改动或者移除,打算用这个来实现一些项目的朋友也注意这一定,毕竟,第一个吃螃蟹的人是有风险的。
不过谷歌表示,现在的预览版本只是一个开始,在接下来的几个月里,他们会根据开发者的反馈和贡献加入 API 进行迭代,当 API 稳定后,Google 会承诺 API 的兼容性,并计划将 Android KTX 作为 Android 支持库的一部分。
关于kotlin:
kotlin是一个由JetBrains开发,基于JVM的编程语言,与Java编程语言100%互通,并具备诸多Java尚不支持的新特性,适用于如今使用Java的所有环境,常用于编写服务器端代码和Android应用。Kotlin还得到了谷歌的支持,已正式成为Android开发一级语言。作为一个简洁的语言,Kotlin支持 lambda,支持闭包,能够减少代码量,提高我们的开发效率。
进入官网了解更多:kotlin官网