对于键入的单个字符,SearchView 提示未显示

Posted

技术标签:

【中文标题】对于键入的单个字符,SearchView 提示未显示【英文标题】:SearchView hints not showing for single character typed 【发布时间】:2016-05-15 17:46:49 【问题描述】:

我正在开发一个用 Scala 编写的 android 应用程序,该应用程序在被 android.support.v7.widget.Toolbar 覆盖的操作栏中使用 android.support.v7.widget.SearchView

在应用程序中,我需要为 SearchView 启用搜索建议。因此,每次检测到查询更改时,我都会检查是否需要更新建议(代码如下)。如果需要更新建议,则调用后端并创建一个包含搜索建议的 android.database.MatrixCursor,并在 SearchViews 建议适配器上设置(代码如下)。

我遇到的问题是输入 single 字符时不会显示搜索提示。在搜索框中键入两个或更多字符效果很好。

我已经尝试在我的 XML 配置中将 android:searchSuggestThreshold 设置为 01 并得到相同的结果(就像忽略该选项一样):搜索提示显示多个输入字符,但不显示单个字符。

我在SearchView 的配置/初始化中遗漏了什么吗?喜欢我可以设置的android:searchSuggestThreshold 以外的选项吗?过去几个小时我一直在寻找替代方案,但找不到任何替代方案。

我看到的一个可能的解决方案是让AutoCompleteTextView 支持SearchView 的输入并将其阈值设置为1,但这是一个丑陋(hack-ish)的解决方案,因为AutoCompleteTextView 不是由SearchViews API 公开。

有没有人知道一个优雅的解决方案?

谢谢!

检测搜索词变化:

//this gets called whenever something is changed in the search box. "s" contains the entire search term typed in the search box
def onQueryTextChange(s: String): Boolean = 
  //this checks to see if a call should be made to the backend to update suggestions
  SearchSuggestionController.query(s) 
  //return false as we're not consuming the event
  false

更新搜索建议:

def updateSuggestions(suggestions: Array[String]): Unit = 
  val cursor = new MatrixCursor(Array(BaseColumns._ID, SearchManager.SUGGEST_COLUMN_TEXT_1), suggestions.length)
  for
    i <- suggestions.indices
    s = suggestions(i)
   cursor.addRow(Array[AnyRef](i.toString, s))

  getActivity.runOnUiThread(() => 
    searchSuggestionAdapter.changeCursor(cursor)
    searchSuggestionAdapter.notifyDataSetChanged()
  )

菜单 SearchView 初始化:

override def onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) = 
    inflater.inflate(R.menu.menu_products, menu)
    val searchManager = getActivity.getSystemService(Context.SEARCH_SERVICE).asInstanceOf[SearchManager]
    val actionItem = menu.findItem(R.id.action_search)
    searchView = MenuItemCompat.getActionView(actionItem).asInstanceOf[SearchView]
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getActivity.getComponentName))
    searchView.setSubmitButtonEnabled(false)
    SearchSuggestionController.onSuggestionsProvided_=(updateSuggestions)
    searchView setSuggestionsAdapter searchSuggestionAdapter
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener()  
      //...
      //change listener for detecting search changes presented above
      //...
    
  //...
  //initialise other components 
  //...

可搜索的配置:

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:label="@string/app_name"
    android:hint="@string/actionbar_products_search_hint"
    android:searchSuggestThreshold="0"
    android:searchSuggestSelection=" ?"/>

【问题讨论】:

你有没有找到一个优雅的、非骇客的解决方案? 到目前为止还没有。没有花太多时间寻找一个(在发布问题后大约 2 个月就停止了)。每当我继续使用具有类似要求的另一个应用程序的该应用程序时,我都会继续寻找(从第一个字符输入开始搜索) 【参考方案1】:

您必须获取 SearchView 对象使用的 SearchAutoComplete 对象的句柄,然后务实地将其阈值设置为 1。(如果您尝试将其设置为 0,它将变为 1,它就像在幕后那样实现)不幸的是它不会工作出于某种原因来自 XML。

SearchView.SearchAutoComplete mSearchSrcTextView = (SearchView.SearchAutoComplete) searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text);
// show results from 1 char
mSearchSrcTextView.setThreshold(1);

【讨论】:

不幸的是,这个解决方案对我没有效果;即使我设置了 setThreshold(5) 它仍然出现在第二个字符处。【参考方案2】:

我在这里看到了你关于“优雅解决方案”的观点,这非常好,但如果你想实现你的目标,我担心 Android API 会强迫你多次做“不优雅”:)

我不知道直接在 AutoCompleteTextView 上设置阈值的解决方法,但如果不是,我建议你多做一步(不是很好)可能会起作用:

获取 EditText 的实例:

AutoCompleteTextView searchText = (AutoCompleteTextView) searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text);

并强制在 onQueryTextChange 中显示文本长度等于 1 的建议:

if(s.length() == 1)
   searchText.showDropDown();

【讨论】:

获得下拉菜单正是我试图避免的。当文本长度为 1 时调用 showDropDown 将与 setThreshold(1) 执行相同的操作。【参考方案3】:

在 SearchView 上设置 OnQueryTextListener。利用它的 onQueryTextChange 来更新你的适配器。

【讨论】:

以上是关于对于键入的单个字符,SearchView 提示未显示的主要内容,如果未能解决你的问题,请参考以下文章

SearchView 忽略大写字母

键入 N 个数字的元组,后跟单个字符串

在 searchView 中删除 SearchIcon 作为提示

如何更改 SearchView 默认图标?

更改操作栏searchview提示文本颜色

在 Python3.6 中键入提示同质队列的正确方法是啥(尤其是对于 PyCharm)?