持续创作,加速成长!这是我参与「掘金日新计划 · 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) != -1
core-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
移除子View
core-ktx
提供了minusAssign()
扩展函数重载了-=
的形式移除子View
:然后就可以这样使用:
group -= view
-
遍历
ViewGroup
中的子View
core-ktx
提供了ViewGroup.iterator()
扩展函数重载了for in
运算符实现遍历:就可以这样使用:
private fun test3() { val group = LinearLayout(this) for (child in group) { //执行操作 } }
-
递归返回
ViewGroup
的所有子View
core-ktx
提供了ViewGroup.descendants
返回ViewGroup
下所有的子View
(直接和间接的):可以看到该扩展属性的返回值是
Sequence
,相比较于返回List
集合,有以下优点:对于返回的子
View
集合进行各种filter、map
等操作不会生成中间集合,只会缓存中间运算操作,遇到末端运算符如first
,才会对集合元素执行真正的操作,所以相比较于List
能够减少中间集合对象的创建,从而减少内存的开销,在一定情况下可以提高执行效率,减少不需要执行的中间运算操作。
最后
core-ktx
库提供的工具方法有很多,本篇文章只是讲述了其十分之一左右,接下来会继续编写其他文章进行讲述。