登录 立即注册
安币:

Kotlin小利器-TargetFun,让多函数接口的调用更加简单 [复制链接]

2018-12-5 21:09
CysionLiu 阅读:136 评论:1 赞:1
Tag:  

喜欢直接看代码的读者请移步:
Kotlin-TargetFun

随着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

图片描述


OnPageChangeListener
图片描述


OnSeekBarChangeListener

图片描述


AnimatorListener

图片描述

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)

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

Kotlin-TargetFun

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

分享到:
我来说两句
facelist
您需要登录后才可以评论 登录 | 立即注册
所有评论(1)
ceshishangchuan 2018-12-10 18:17
学习一下,kotlin还能再优化~
回复

站长推荐

通过邮件订阅最新安卓weekly信息
上一条 /4 下一条

下载安卓巴士客户端

全国最大的安卓开发者社区