科尔廷解决方案:
我在 Koltin 做了一个扩展来实现这一点。即使使用过滤器,我也尝试了很多方法,但有一些错误,Filter
比如在输入时重复相同的文本。
fun EditText.onAfterTextChanged(allowedChars: String, listener: (String) -> Unit) {
addTextChangedListener(object : TextWatcher {
override fun afterTextChanged(editable: Editable?) {
val input = editable.toString()
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) {
}
})
}
fun replaceInvalidCharacters(value: String, allowedChars: String): String {
var finalValue = value.replace("\\p{So}+".toRegex(), "") // To remove emojis when copy paste
if (finalValue.isNotEmpty()) {
val lastChar = finalValue.last()
if (!allowedChars.contains(lastChar, false)) {
finalValue = finalValue.dropLast(1)
}
}
return finalValue
}
您可以在 Activity 中使用它,如下所示:
editText.onAfterTextChanged(getString(R.string.supported_digits)) { // Here you can pass whatever the digits you want to allow
val length = it.length
if (length > 250) { // You can also check how much length to allow
return@onAfterTextChanged
}
}
- 您可以将任何您想要允许的字符传递给它
- 它会在输入时过滤表情符号
- 即使您复制粘贴它也会删除表情符号
- 它将只允许出现在 allowedChars 中的字符
- 它适用于所有安卓版本
- 它将解决使用过滤器重复文本的问题