【发布时间】:2019-12-13 22:06:52
【问题描述】:
我想为血压单位屏蔽 EditText,例如 (###/###)。
值可以是2digits/2digits 或3digits/3digits 或3digits/2digits 或2digits/3digits
目前我正在使用以下代码,该代码适用于 2digits/2digits 或 3digits/3digits 或 3digits/2digits 不适用于 2digits/3digits。
这是我的代码:
import android.text.Editable
import android.text.TextUtils
import android.text.TextWatcher
import android.widget.EditText
import com.google.android.material.textfield.TextInputLayout
object EditTextBPMask {
private const val mask22 = "##/##"
private const val mask32 = "###/##"
private const val mask33 = "###/###"
fun unmask(s: String): String {
return s.replace("[^0-9]*".toRegex(), "")
}
fun insert(editText: EditText): TextWatcher {
return object : TextWatcher {
var isUpdating: Boolean = false
var old = ""
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {
val str = unmask(s.toString())
val mask: String
val defaultMask = getDefaultMask(str)
mask = when (str.length) {
6 -> mask33
5 -> mask32
else -> defaultMask
}
var mascara = ""
if (isUpdating) {
old = str
isUpdating = false
return
}
var i = 0
for (m in mask.toCharArray()) {
if (m != '#' && str.length > old.length || m != '#' && str.length < old.length && str.length != i) {
mascara += m
continue
}
try {
mascara += str[i]
} catch (e: Exception) {
break
}
i++
}
isUpdating = true
editText.setText(mascara)
editText.setSelection(mascara.length)
/*if (isValid(editText)) {
editText.error = null
}
else {
editText.error = "Incorrect value!"
}*/
}
override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}
override fun afterTextChanged(s: Editable) {}
}
}
private fun getDefaultMask(str: String): String {
var defaultMask = mask22
if (str.length > 6) {
defaultMask = mask33
}
return defaultMask
}
fun isValid(editText: EditText): Boolean {
return if (!TextUtils.isEmpty(editText.text.toString())) {
unmask(editText.text.toString()).length > 3
}
else {
false
}
}
}
【问题讨论】:
标签: java android kotlin masking input-mask