Kotlin仿Butterknife风格设置点击事件

之前用java使用Butterknife时设置点击方式是这样子的:

@OnClick({R.id.xxxx1, R.id.xxxx2, R.id.xxxx3})
	public void onViewClicked(View v) {
		switch (v.getId()) {
			case R.id.xxxx1:
				...
			break;
    		case R.id.xxxx2:
				...
			break;
    		case R.id.xxxx3:
				...
			break;
		}
}

因为现在换成Kotlin语言了,Butterknife的作用就不是很大,显得鸡肋,但是如果不用Butterknife的话那点击事件该怎么搞呢?
思考了一番,根据Butterknife的风格我写了一个顶级拓展函数具体如下:

/**
 * 设置点击事件
 * @param views 需要设置点击事件的view
 * @param onClick 点击触发的方法
 */
fun setOnclick(vararg views: View?, onClick: (View) -> Unit) {
    views.forEach {
        it?.setOnClickListener { view ->
            onClick.invoke(view)
        }
    }
}

大概流程就是根据传入的可变数量的views,循环给他们设置点击事件,触发点击时,调用onClick方法回调

然后在BaseActivity/BaseFragment(你的基类)定义一个方法:

open fun onViewClicked(){} 

在BaseActivity onCreate() / BaseFragment onViewCreated()时调用该方法

activity:
 override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
	...
    onViewClicked()
}

fragment:
 override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
	...
    onViewClicked()
}

最后Activity/Fragment使用时如果需要设置点击事件可以重写 onViewClicked 方法调用拓展函数setOnclick方法,传入你要设置点击事件的view :

override fun onViewClicked() {
    setOnclick(xxxx1,xxxx2,xxxx3){
        when(it.id){
            R.id.xxxx1 ->{
                ...
            }
            R.id.xxxx2 ->{
                ...
            }
			R.id.xxxx3 ->{
                ...
            }
        }
    }
}

###拓展:既然决定这么设置点击事件的话,我们也可以顺便整整防止重复点击事件

添加顶级拓展函数:


/**
 * 设置防止重复点击事件
 * @param views 需要设置点击事件的view
 * @param interval 时间间隔 默认0.3秒
 * @param onClick 点击触发的方法
 */
fun setOnclickNoRepeat(vararg views: View?, interval: Long = 300, onClick: (View) -> Unit) {
    views.forEach {
        it?.clickNoRepeat(interval = interval) { view ->
            onClick.invoke(view)
        }
    }
}

/**
 * 防止重复点击事件 默认0.3秒内不可重复点击
 * @param interval 时间间隔 默认0.3秒
 * @param action 执行方法
 */
var lastClickTime = 0L
fun View.clickNoRepeat(interval: Long = 300, action: (view: View) -> Unit) {
    setOnClickListener {
        val currentTime = System.currentTimeMillis()
        if (lastClickTime != 0L && (currentTime - lastClickTime < interval)) {
            return@setOnClickListener
        }
        lastClickTime = currentTime
         action.invoke(it)
    }
}

在Activity/Fragment中使用时:

override fun onViewClicked() {
    setOnclickNoRepeat(xxxx1,xxxx2,xxxx3){
        when(it.id){
            R.id.xxxx1 ->{
                ...
            }
            R.id.xxxx2 ->{
                ...
            }
			R.id.xxxx3 ->{
                ...
            }
        }
    }
}

##最后总结:Kotlin真的香,还在用Java的赶紧用Kotlin吧,不香我直播日5档电风扇

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值