zoukankan      html  css  js  c++  java
  • Kotlin开发 扩展函数在Android开发中的一些实用例子

    前言

      扩展函数的意思是在一些已经被实现的类里,添加你自己需要的自定义方法。这样我们不需要写静态方法的工具类来实现需要的函数方法,而是直接在原有类的基础上去扩展。扩展函数在很多现代高级语言里都是支持的,但是Java很遗憾不支持这个功能。但是kotlin支持此功能。下面我们就来讲解在Android上可能能使用扩展函数的一些例子。

    例子1:点击间隔实现

      在实际Android开发中,其实很多按钮都是需要一些点击间隔的,保证这个按键不会被连续点击导致创建多个Activity或者短时间内请求多个网络接口。我以前在 https://www.cnblogs.com/guanxinjing/p/10905850.html 这篇博客中有说明如何使用Java来实现按键的点击延迟。你可以看到不管是那种方式,在使用的时候都是极其麻烦的。需要写很多冗余模板代码。

      但是有了kotlin扩展函数的支持,我们就可以很简单是使用扩展函数帮我们直接在View上拓展一个点击间隔函数。

    第一步,首先我们要创建一个与我们需要扩展函数的View同名的.kt文件。比如我们需要重写setOnClickListener这个点击方法,这个方法是在View这个类里的。所以我们需要创建一个View.kt文件

    第二步,实现扩展方法

    import android.view.View
    private var clickInterval = 400L
    private var lastTime = 0L
    
    fun View.setOnIntervalClickListener(onIntervalClickListener: (View) -> Unit) {
        this.setOnClickListener {
            if (System.currentTimeMillis() - lastTime > clickInterval) {
                lastTime = System.currentTimeMillis()
                onIntervalClickListener.invoke(it)
            }
    
        }
    
    }

    另外,如果你需要控制这个扩展函数的作用域,只需要在函数方法fun前面添加可见性修饰符即可。这样你就可以在限定范围内调用这个扩展函数,从而不影响到其他模块。

    • public        全局可见
    • internal        当前模块Model中可见
    • protected       当前包可见
    • private            当前类可见

    第三步,使用它

        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            
            textView.setOnIntervalClickListener {
                Toast.makeText(this, System.currentTimeMillis().toString(), Toast.LENGTH_LONG).show()
            }
        }

    例子2:监听EditText的文本变化

      在Java里监听EditText的文本变化是特别啰嗦的,因为需要实现TextWatcher的3个方法。如果你其实只想监听字数或者文字内容变化,google在模板代码里提供了一个例子,来让这个方法简单化。代码如下:

    /**
     * Extension function to simplify setting an afterTextChanged action to EditText components.
     */
    fun EditText.afterTextChanged(afterTextChanged: (String) -> Unit) {
        this.addTextChangedListener(object : TextWatcher {
            override fun afterTextChanged(editable: Editable?) {
                afterTextChanged.invoke(editable.toString())
            }
    
            override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}
    
            override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {}
        })
    }

    End

  • 相关阅读:
    MySQL-LSN
    MySQL Binlog三种格式介绍及分析
    MySQL中的seconds_behind_master的理解
    MySQL的四种事务隔离级别
    pt-table-sync修复mysql主从不一致的数据
    MySQL主从不同步、数据不一致解决办法
    nginx的应用【静态代理、动静分离】
    Redis数据缓存淘汰策略【FIFO 、LRU、LFU】
    Java基本知识点o(1), o(n), o(logn), o(nlogn)的了解
    JS函数篇【2】
  • 原文地址:https://www.cnblogs.com/guanxinjing/p/13713359.html
Copyright © 2011-2022 走看看