SearchView不会在第二个点上调用onQueryTextChange

我的活动有SearchView,应该过滤查询。 我通过onQueryTextListener过滤它。 想法是禁用键入不允许字符,如点,逗号,斜杠等 – 只允许[AZ]这里是代码(我正在使用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”。 所以,它工作正常。 但是,当我第二次键入点(“。”)onQueryTextChange根本不调用 – 我已经在方法的第一行设置断点。 它在两个不同的手机上进行了测试,所以它不是键盘设置或像这样的。 为什么监听器不调用?

编辑

我正在使用正则表达式来验证查询:

 fun validateQuery(query: String?): String? { val regex = Regex("^([AZ]+)") // Return first match or null return query?.let { regex.find(it.toUpperCase()) }?.value } 

不要关心正则表达式的创建 – 我通过DI提供它,所以它只创建一次活动。 也许这可能是问题?

我发现问题:更改onQueryTextChange内部的查询文本是不好的 – 如果我们看看SearchView类的内部,有这样的代码:

 void onTextChanged(CharSequence newText) { ... if (mOnQueryChangeListener != null && !TextUtils.equals(newText, mOldQueryText)) { mOnQueryChangeListener.onQueryTextChange(newText.toString()); } mOldQueryText = newText.toString(); } 

所以,旧的查询文本将被更新两次 – 第一次用正确的查询“ABC”,第二次用错误的一个“ABC ..”,据我所知。

在onQueryTextChange之后,我会单独询问其他问题

非常感谢@pskink!

我已经实现了自定义SearchView与筛选器输入查询和能够禁用onQueryTextChange触发setQuery。 这是Kotlin,让我们继续这个美丽的语言:)我希望这将是有用的人。

这是Gist的代码