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

  • 相关阅读:
    SSL JudgeOnline 1194——最佳乘车
    SSL JudgeOnline 1457——翻币问题
    SSL JudgeOnlie 2324——细胞问题
    SSL JudgeOnline 1456——骑士旅行
    SSL JudgeOnline 1455——电子老鼠闯迷宫
    SSL JudgeOnline 2253——新型计算器
    SSL JudgeOnline 1198——求逆序对数
    SSL JudgeOnline 1099——USACO 1.4 母亲的牛奶
    SSL JudgeOnline 1668——小车载人问题
    SSL JudgeOnline 1089——USACO 1.2 方块转换
  • 原文地址:https://www.cnblogs.com/guanxinjing/p/13713359.html
Copyright © 2011-2022 走看看