【问题标题】:SearchView hints not showing for single character typed对于键入的单个字符,SearchView 提示未显示
【发布时间】: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 个月就停止了)。每当我继续使用具有类似要求的另一个应用程序的该应用程序时,我都会继续寻找(从第一个字符输入开始搜索)

标签: android autocomplete searchview


【解决方案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 来更新你的适配器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-01
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 2016-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多