你需要了解的官方core-ktx库能对开发带来哪些便利1

持续创作,加速成长!这是我参与「掘金日新计划 · 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扩展方法:

image.png

然后就可以这样使用:

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

使得我们可以这样实现动画的监听方法:

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

然后我们就可以根据需要这样写了:

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

    之前的实现方式:

    val group = LinearLayout(this)
    val isContain = group.indexOfChild(view) != -1
    

    core-ktx提供了contains运算符重载扩展方法:

    image.png

    我们就可以这样判断(contains重载的运算符就是in):

    val group = LinearLayout(this)
    val isContain = view in group
    
  2. ViewGroup添加一个子View

    传统的方法是通过addView()实现,不过core-ktx提供了plusAssign()扩展函数重载了+=的形式添加子View:

    image.png

    我们就可以在代码里这样添加子View

    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

    就可以这样使用:

    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库提供的工具方法有很多,本篇文章只是讲述了其十分之一左右,接下来会继续编写其他文章进行讲述。

猜你喜欢

转载自juejin.im/post/7115048686170112037