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

喜欢直接看代码的读者请移步:
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

在这里插入图片描述


OnSeekBarChangeListener

在这里插入图片描述


OnPageChangeListener

在这里插入图片描述


AnimatorListener

在这里插入图片描述

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

Kotlin-TargetFun

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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值