Kotlin小利器,让多函数接口的调用更加简单

Posted 安卓巴士Android开发者门户

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kotlin小利器,让多函数接口的调用更加简单相关的知识,希望对你有一定的参考价值。


随着Kotlin的加入,在安卓开发中写代码变得越发的简洁和灵活。比如原来的时候用Java书写一个最简单的View的点击事件,代码是这样:

 btn1.setOnClickListener(new OnClickListener(){
            public void onClick(View v{
       
            }
  });

现在来看,代码真是有些冗余。在kotlin中,多亏其支持lamada表达式,函数参数以及扩展函数,会让代码变变成这样:

 btn1.setOnClickListener { 

 }

然而,面对多函数接口的时候,原生Kotlin并没有给出这么简洁的解决方案。想必有些读者有些疑问,啥是多函数接口呢?举个例子更好解释,最常见的就是给EditText这个控件添加个文本变化监听接口TextWatcher,大家对这个接口很熟悉,知道其有3个方法,但是我们往往只会用其中1-2个方法,用不到的方法也必须列出来。对,最常见的就是这么写:

EditText(this).addTextChangedListener(object :TextWatcher{
            override fun afterTextChanged(s: Editable?) {
            }

            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
            }

            override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
            }
        })

上面这种写法真是太像Java了,不只如此,目前IDE还不能给出比较智能的提示,当写addTextChangedListener()方法时,IDE只提示要传入个TextWatcher,然而怎么传却不知道,我想刚接触这块的读者,肯定会百度一番,发现需要传入个object :TextWatcher,这时候肯定还不算传入成功,然而,IDE却仍不能给出足够的提示,还需要手动再把{}输入,才会在object上出现提示,让全部实现接口的3个方法。。。整个过程既冗余又没有足够智能的提示。

针对这种状况,有些读者(包括作者)肯定不爽了,于是网上出现了比较常见的两种方式:

1.不灵活,多方法混用和修改都无扩展性

2.灵活,却不简洁

在我看来,要能够简洁的调用类似TextWatcher这种多函数接口,应达到三点:

  1. 灵活,想调用那个方法就用哪个,不需要的则不需要列出;

  2. 简洁,只写能真正干活且易读的代码,其它变量什么的能省就省;

  3. 提示,能让IDE足够智能的提示出接下来代码该怎么写。

很明显,上面两种方案都达不到。

说到这里,本文的主角总算出来了,那就是Kotlin-TargetFun,这个库专为简化多函数接口而生,语言苍白,还是代码比较有表达力。当用这个库时,你可以这样为EditText添加监听:

EditText(this)._addTextChangedListener {
        _onTextChanged { s, start, before, count ->

        }
    }

或者这样

EditText(this)._addTextChangedListener {
        _beforeTextChanged { s, start, count, after ->

        }
        _onTextChanged { s, start, before, count ->

        }
    }

或者这样

 EditText(this)._addTextChangedListener {
        _onTextChanged { s, start, before, count ->

        }
        _afterTextChanged {

        }
    }

这时候再来看是否能达到上面说的三点要求:

灵活,想用哪个方法就写哪个;

简洁,除了必须要写的方法名就只有{}了;

提示,所有方法名字都以 _ 开头,这让IDE有足够的上下文去推断下面该做什么;

这里需要声明,Java开发规范中,一般不让方法名中出现  _,但,这是灵活的kotlin,其中的扩展函数更是需要统一命名方式,否则当扩展方法多了之后,可能跟官方原生的方法产生误解。

目前TargetFun支持的多函数接口如下
  • TextWatcher

  • ViewPager.OnPageChangeListener

  • Animator.AnimatorListener

  • AbsListView.OnScrollListener

  • RecyclerView.OnScrollListener

  • SeekBar.OnSeekBarChangeListener

  • View.OnAttachStateChangeListener

  • DrawerLayout.DrawerListener

  • View.OnClickListener(filter)

  • Observer (rx)

  • FlowableSubscriber (rx)

  • 一些彩蛋(๑๑)

语言有些苍白,来些实际效果让读者能更直观的理解:


TextWatcher

Kotlin小利器,让多函数接口的调用更加简单

OnPageChangeListener

Kotlin小利器,让多函数接口的调用更加简单

OnSeekBarChangeListener

Kotlin小利器,让多函数接口的调用更加简单

AnimatorListener

Kotlin小利器,让多函数接口的调用更加简单

Observer

彩蛋

Edittext的扩展函数,打开/关闭键盘

EditText(this).openKeyBoard()

EditText(this).hideKeyBoard()

过滤频繁点击

Button(this)._setOnClickListener {
    }

跳转Activity,1000请求码

_startActivityForResult<EditExActivity>(1000)

_startActivity<EditExActivity>()

str(resid), drawable(resid)等方法

TextView(this).text=str(R.string.app_name)

以上只是少部分该库的运用,想要看更全的介绍或者想在项目中使用本库,请移步至

https://github.com/CysionLiu/kotlin-targetFun

喜欢或者觉得有帮助,请star一下,这将是作者莫大的动力。




大家都在看




欢迎前往安卓巴士博客区投稿,技术成长于分享

期待巴友留言,共同探讨学习


以上是关于Kotlin小利器,让多函数接口的调用更加简单的主要内容,如果未能解决你的问题,请参考以下文章

调试利器GDB-下

调试利器GDB-下

Kotlin编译时注解,简单实现ButterKnife

Kotlin学习之路:继承

kotlin方法传入lambda表达式参数并调用invoke什么意思

Kotlin 标准函数 笔记