【发布时间】:2017-07-13 09:32:59
【问题描述】:
我的 Activity 有 SearchView,它应该有过滤查询。我正在通过 onQueryTextListener 过滤它。想法是禁用输入不允许的字符,如点、逗号、斜线等 - 只允许 [A-Z] 这是代码(我使用的是 Kotlin,但它对 Java 是可读的):
var shouldQueryChangeBeInvoked = true
override fun onCreate(savedInstanceState: Bundle?) {
...
searchField.setOnQueryTextListener(this)
}
override fun setSearchQuery(query: String) {
shouldQueryChangeBeInvoked = false
searchField.setQuery(query, false)
shouldQueryChangeBeInvoked = true
}
override fun onQueryTextChange(newText: String?): Boolean {
if (!shouldQueryChangeBeInvoked) {
return false
}
val validQuery = validateQuery(newText)
validQuery?.let { setSearchQuery(it) }
return false
}
例如,当我键入“ABC”时。它转换为“ABC”。所以,它工作正常。 但是,当我第二次键入 dot(".") 时,onQueryTextChange 根本不会调用 - 我在方法的第一行设置了断点。 它在两部不同的手机上进行了测试,所以它不是键盘设置或类似的东西。 为什么监听器不调用?
编辑
验证我使用 Regex 进行的查询:
fun validateQuery(query: String?): String? {
val regex = Regex("^([A-Z]+)")
// Return first match or null
return query?.let { regex.find(it.toUpperCase()) }?.value
}
不要关心正则表达式的创建 - 我通过 DI 提供它,因此每个活动只创建一次。 可能有问题?
【问题讨论】:
-
我正在输入任何内容,“whatever”被传递给
onQueryTextChange- 包括点 -
@pskink 所以如果你输入“whatever..”它会变成“whatever”?
-
是的,这是 logcat 输出:
onQueryTextChange whatever...... -
@pskink 我已经编辑了问题,我正在使用正则表达式。如果输入第一个点,则返回有效字符串,输入第二个点上带有点的字符串
-
它的 java,而不是 kotlin:pastebin.com/Q8LDpkPd
标签: android regex listener searchview