持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第7天,点击查看活动详情
接下来准备出一个系列的文章,专门研究
Android官方提供的core-ktx库里面的扩展类、方法等等,看看能为项目开发带来哪些便利。
基于core-ktx:1.7.0版本分析
dependencies {
implementation 'androidx.core:core-ktx:1.7.0'
}
SharedPreferences.edit扩展方法
先看下以前我们怎么往SharedPreferences写入值的:
private fun test1() {
val sp = getSharedPreferences("data", Context.MODE_PRIVATE)
val edit = sp.edit()
edit.putString("key", "value");
edit.apply()
}
有点小麻烦,所以core-ktx提供了SharedPreferences.edit扩展方法:
然后就可以这样使用:
private fun test1() {
getSharedPreferences("data", Context.MODE_PRIVATE).edit(false) {
putString("key", "value")
}
}
Animator.xxx动画系列扩展
先看下监听动画开始、暂停、恢复、取消、结束的代码之前是怎么写的:
这个地方实现的是AnimatorListenerAdapter动画监听类,这个类其实已经帮助我们对原来的动画监听类Animator.AnimatorListener做了一层优化,使得我们只用有选择性的重写需要的监听方法即可。不过这个地方我为了展示,索性就全部进行了重写。
不过,core-ktx库为我们提供了Animator.addListener的扩展方法:
使得我们可以这样实现动画的监听方法:
private fun test2() {
val anim = ValueAnimator.ofInt(0, 100)
anim.addListener(onStart = {
}, onEnd = {
}, onRepeat = {
})
anim.start()
}
当然了,如果你觉得这样写还是很麻烦,比如我只想简单的监听下动画开始或者动画结束等等,那贴心的core-ktx还提供了下面的扩展方法doOnxxx()系列,比如Animator.doOnEnd()、Animator.doOnStart():
然后我们就可以根据需要这样写了:
private fun test2() {
val anim = ValueAnimator.ofInt(0, 100)
anim.doOnEnd {
}
anim.doOnStart {
}
anim.start()
}
TextView.doxxx内容监听扩展方法
和上面的动画提供的扩展方法类似,core-ktx对于TextView实现文本内容的监听也提供了以下几个方法,分别对应着文本变化前、变化中、变化后的监听:
这样我们就不用每次都需要手动构造一个TextWatcher并强制重写里面的三个方法来是文本内容监听了,这里就不再举例描述了。
xxx.toUri、xxx.toFile扩展方法
在这里,core-ktx提供了更简单的路径字符串转uri、文件转uri:
同样还提供了uri转File文件的扩展方法:
ViewGroup.xxx相关扩展方法
-
判断当前
ViewGroup是否包含某个子View之前的实现方式:
val group = LinearLayout(this) val isContain = group.indexOfChild(view) != -1core-ktx提供了contains运算符重载扩展方法:我们就可以这样判断(
contains重载的运算符就是in):val group = LinearLayout(this) val isContain = view in group -
往
ViewGroup添加一个子View传统的方法是通过
addView()实现,不过core-ktx提供了plusAssign()扩展函数重载了+=的形式添加子View:我们就可以在代码里这样添加子
View:private fun test3(view: View) { val group = LinearLayout(this) //添加子View group += view } -
从
ViewGroup移除子Viewcore-ktx提供了minusAssign()扩展函数重载了-=的形式移除子View:然后就可以这样使用:
group -= view -
遍历
ViewGroup中的子Viewcore-ktx提供了ViewGroup.iterator()扩展函数重载了for in运算符实现遍历:就可以这样使用:
private fun test3() { val group = LinearLayout(this) for (child in group) { //执行操作 } } -
递归返回
ViewGroup的所有子Viewcore-ktx提供了ViewGroup.descendants返回ViewGroup下所有的子View(直接和间接的):可以看到该扩展属性的返回值是
Sequence,相比较于返回List集合,有以下优点:对于返回的子
View集合进行各种filter、map等操作不会生成中间集合,只会缓存中间运算操作,遇到末端运算符如first,才会对集合元素执行真正的操作,所以相比较于List能够减少中间集合对象的创建,从而减少内存的开销,在一定情况下可以提高执行效率,减少不需要执行的中间运算操作。
最后
core-ktx库提供的工具方法有很多,本篇文章只是讲述了其十分之一左右,接下来会继续编写其他文章进行讲述。
已更新的系列其他文章: