美文网首页
Kotlin仿Butterknife风格设置点击事件

Kotlin仿Butterknife风格设置点击事件

作者: 菜的扣jio啊 | 来源:发表于2020-03-23 15:21 被阅读0次

    之前用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档电风扇

    相关文章

      网友评论

          本文标题:Kotlin仿Butterknife风格设置点击事件

          本文链接:https://www.haomeiwen.com/subject/zsywyhtx.html