android - Jetpack Compose TextField InputFilter 仅具有货币正则表达式输入

标签 android kotlin android-jetpack-compose

是否有可能有 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

    }

}

最佳答案

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

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")
}

关于android - Jetpack Compose TextField InputFilter 仅具有货币正则表达式输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65641875/

相关文章:

android - 插件 ID 包含无效字符 ':'(只有 ASCII 字母数字字符、 '.'、 '_' 和 '-' 字符是有效的 JETPACK COMPOSE

android - 将 Android Studio 从版本 3.1.3 更新到版本 3.1.4 时出现的问题

testing - kotlin:如何从 Spek 类继承以拥有公共(public)夹具

android - 如何在 Material Design 中创建后退按钮

kotlin - 如何在 Kotlin 中使用 GROUP BY 进行 COUNT(*)?

java - 在底部导航栏中添加项目

kotlin - 在 Kotlin 中使用 for 循环初始化 MutableStateMapOf 变量

android - 为什么我们需要 ViewModelProvider.Factory 来将 View 模型传递给屏幕?

android - 重新启动 Activity 中的 fragment

android.intent.action.SCREEN_ON 不能用作接收器 Intent 过滤器