Jetpack Compose文本框输入过滤器,仅允许输入货币正则表达式。

3

有没有可能拥有一系列的InputFilters,例如只允许输入类似于$1,01$100,95的输入,这是通过以下方式完成的:

editText.filters = arrayOf(CurrencyFormatInputFilter(), InputFilter.LengthFilter(8))

class CurrencyFormatInputFilter : InputFilter {

    private val pattern = Pattern.compile(CURRENCY_INPUT_REGEX)

    override fun filter(
        source: CharSequence,
        start: Int,
        end: Int,
        dest: Spanned,
        dstart: Int,
        dend: Int
    ): CharSequence? {

        val result = (dest.subSequence(0, dstart).toString()
                + source.toString()
                + dest.subSequence(dend, dest.length))

        val matcher = pattern.matcher(result)

        return if (!matcher.matches()) dest.subSequence(dstart, dend) else null

    }

}
1个回答

6

我的建议是在插入无效值时显示错误信息。例如:

fun isValidEmail(emailStr: String?) = 
    Pattern
        .compile(
            "^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,6}$", 
            Pattern.CASE_INSENSITIVE
        ).matcher(emailStr).find()

...

var emailText by remember { mutableStateOf("") }
var showError by remember { mutableStateOf(false) }
TextField(
    value = emailText,
    onValueChange = {
        emailText = it
        showError = !isValidEmail(it)
    },
    isErrorValue = showError,
    label = { Text(text = "Email") },
    modifier = Modifier.fillMaxWidth()
)
if (showError) {
    Text("Email is invalid")
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接