【问题标题】:SearchView not calls onQueryTextChange on second dotSearchView 不在第二个点上调用 onQueryTextChange
【发布时间】: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


【解决方案1】:

非常感谢@pskink!

我已经实现了带有过滤输入查询的自定义 SearchView,并且能够禁用在 setQuery 上触发 onQueryTextChange。 是 Kotlin,让我们继续学习那优美的语言 :) 我希望它对某人有用。

这里是Code on Gist

【讨论】:

  • 有一个错字:CustomNumberKeyLister -> CustomNumberKeyListener,你还需要shouldChangeListenerBeInvoked做什么?
  • 如果您想在设置查询文本时只禁用一次onQueryTextChange,请在调用super.setQuery(query, submit) 之前禁用侦听器并在之后启用它 - 所以不需要CustomQueryTextListenershouldChangeListenerBeInvoked amd mOnQueryChangeListener
  • 感谢您的评论!在哪里禁用那个监听器?在你的活动中?我认为最好实现一个自定义类并且不对您的 Activity 进行任何更改。无论如何,我只是决定展示可能的解决方案,我不会假装最好:)
  • 啊,抱歉,我没听懂。你是对的,就我的情况来说这会很好,但是如果我想稍后调用 onChange 监听器怎么办?所以,这两种情况都完成了
  • 翻译成这个 kotlin 代码:pastebin.com/raw/imG9CtHr
【解决方案2】:

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

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

因此,旧查询文本将更新两次 - 第一次使用正确的查询“ABC”,第二次使用错误的“ABC..”,据我了解。

关于在 onQueryTextChange 之后更改查询,我会单独询问其他问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-14
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    相关资源
    最近更新 更多