繁体   English   中英

如何将参数传递给 Kotlin 中的扩展 function

[英]How to pass a parameter to a extension function in Kotlin

我在 kotlin 中有一个扩展 function 来检查它是否是一个有效的字符串,如下所述。

fun EditText.onAfterTextChanged(listener: (String) -> Unit) {
    addTextChangedListener(object : TextWatcher {
        override fun afterTextChanged(editable: Editable?) {
            val input = editable?.toString()
            val allowedChars = context.getString(R.string.supported_digits)
            val newValue = replaceInvalidCharacters(input, allowedChars)
            if (newValue != input) {
                setText(newValue)
                setSelection(text.length)
            }
            listener(newValue)
        }

        override fun beforeTextChanged(s: CharSequence?, p1: Int, p2: Int, p3: Int) {
        }

        override fun onTextChanged(s: CharSequence?, p1: Int, p2: Int, p3: Int) {
        }
    })
}

private fun replaceInvalidCharacters(value: String?, allowedChars: String): String {
    var finalValue = value ?: ""
    if (finalValue.isNotEmpty()) {
        val lastChar = finalValue.last()
        if (!allowedChars.contains(lastChar, false)) {
            finalValue = finalValue.dropLast(1)
        }
    }
    return finalValue
}

我像这样使用它:

editText.onAfterTextChanged {
        val length = it.length
        if (length >= 250) {
            activity?.toast(getString(R.string.max_limit_reached))
            return@onAfterTextChanged
        }
}

在这里,我想将allowedChars作为参数传递给此扩展,因为应用程序中的不同 EditText 有不同的字符串。 像 1 EditText 可能只允许数字但不允许 +,- 和一些编辑文本可能只允许字母数字等。有没有办法将参数传递给扩展?

您可以做的是通过在回调 function 之前添加一个参数来更新扩展 function 签名。 所以,它看起来像这样

fun EditText.onAfterTextChanged(allowedChars: String, listener: (String) -> Unit) {
    addTextChangedListener(object : TextWatcher {
        override fun afterTextChanged(editable: Editable?) {
            val input = editable?.toString()
            val allowedChars = context.getString(R.string.supported_digits)
            val newValue = replaceInvalidCharacters(input, allowedChars)
            if (newValue != input) {
                setText(newValue)
                setSelection(text.length)
            }
            listener(newValue)
        }

        override fun beforeTextChanged(s: CharSequence?, p1: Int, p2: Int, p3: Int) {
        }

        override fun onTextChanged(s: CharSequence?, p1: Int, p2: Int, p3: Int) {
        }
    })
}

你可以这样称呼它:

editText.onAfterTextChanged("123abc") {
    val length = it.length
    if (length >= 250) {
        activity?.toast(getString(R.string.max_limit_reached))
        return@onAfterTextChanged
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM