Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/218.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 当第一个字母不是';t被输入筛选器接受,则不接受任何条目_Android_Kotlin - Fatal编程技术网

Android 当第一个字母不是';t被输入筛选器接受,则不接受任何条目

Android 当第一个字母不是';t被输入筛选器接受,则不接受任何条目,android,kotlin,Android,Kotlin,这与我在这里提出的问题类似,但有点不同: 在我的示例中,我制作了一个输入过滤器来验证加拿大邮政编码 我这里有一个摘要: abstract class MyInputFilter : InputFilter { protected abstract fun String.isValid(): Boolean private fun getFinalResultOfChange(source: CharSequence, start: Int, end: Int, dest: Spanned,

这与我在这里提出的问题类似,但有点不同:

在我的示例中,我制作了一个输入过滤器来验证加拿大邮政编码

我这里有一个摘要:

abstract class MyInputFilter : InputFilter {

protected abstract fun String.isValid(): Boolean

private fun getFinalResultOfChange(source: CharSequence, start: Int, end: Int, dest: Spanned, dstart: Int, dend: Int): CharSequence {
    return dest.replaceRange(dstart, dend, source.subSequence(start, end))
}

private fun getNoChangeResult(source: CharSequence, start: Int, end: Int, dest: Spanned, dstart: Int, dend: Int): CharSequence {
    val initialSubSequence = dest.subSequence(dstart, dend)
    return try {
        if (source is Spanned) {
            val spannable = SpannableString(initialSubSequence)
            TextUtils.copySpansFrom(source, start, end, null, spannable, 0)
            spannable
        } else {
            initialSubSequence
        }
    } catch (e: Exception) {
        initialSubSequence
    }
}

override fun filter(source: CharSequence?, start: Int, end: Int, dest: Spanned?, dstart: Int, dend: Int): CharSequence? {
    if (source == null || dest == null) {
        return null
    }

    val input = getFinalResultOfChange(source, start, end, dest, dstart, dend).toString()

    return if (input.isValid()) {
        null // Allow the edit to proceed unchanged.
    } else {
        getNoChangeResult(source, start, end, dest, dstart, dend)
    }
}
}

我继承并重写的对我的所有输入筛选器都有效。这个过滤器是。。。奇怪的是,这是基于上面链接的问题产生的,在某种程度上解决了我的问题

这是幼稚的,因为我的意图是深思熟虑的,但以下是CAN过滤器:

    private val patterns = listOf(
        "^(?!.*[DFIOQUdfioqu])[A-VXYa-vxy]$",
        "^(?!.*[DFIOQUdfioqu])[A-VXYa-vxy][0-9]$",
        "^(?!.*[DFIOQUdfioqu])[A-VXYa-vxy][0-9][A-Za-z]$",
        "^(?!.*[DFIOQUdfioqu])[A-VXYa-vxy][0-9][A-Za-z][0-9]$",
        "^(?!.*[DFIOQUdfioqu])[A-VXYa-vxy][0-9][A-Za-z][0-9][A-Za-z]$",
        "^(?!.*[DFIOQUdfioqu])[A-VXYa-vxy][0-9][A-Za-z][0-9][A-Za-z][0-9]$"
    )

    override fun String.isValid(): Boolean {
        return when (length) {
            0 -> true
            1, 2, 3, 4, 5, 6 -> this.matches(Regex(patterns[length - 1]))
            else -> false
        }
    }
现在,我有一个新问题。如果输入的第一个字符是无效字母,键盘将继续将字符加载到“word”中并尝试重新提交。所以,如果我打字

D
DA
正确地说,没有输入任何内容。但是,如果我打字

D
DA
仍然没有输入任何内容,我的手机正在尝试“自动提示”单词“da”。除非我单击建议的单词或退格为空,否则该字段将不接受任何类型的输入,但键盘将继续使用我键入的所有字母“排队”单词。如果我在任何其他位置输入了一个坏字符,只要第一个字符被接受,它就可以工作。手机不会开始在键盘上“排队”输入单词,我可以立即输入正确的字符

同样重要的是:数字不会引起问题。键盘不会尝试从数字开始“构建”单词,因此如果我键入

1A
然后在字段中输入“A”,没有问题

我几乎找不到任何人在输入过滤器和可spannable vs not spannable CharSequence输入方面有这些问题,但键盘正在构建一个单词,并试图以我不理解的方式提交整个内容。我曾在OnePlus 6T的GBoard上试用过它,以及三星Tab E的默认三星键盘,所以感觉它不像是一个单独的键盘错误