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的默认三星键盘,所以感觉它不像是一个单独的键盘错误