对于键入的单个字符,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
,并在 SearchView
s 建议适配器上设置(代码如下)。
我遇到的问题是输入 single 字符时不会显示搜索提示。在搜索框中键入两个或更多字符效果很好。
我已经尝试在我的 XML 配置中将 android:searchSuggestThreshold
设置为 0
和 1
并得到相同的结果(就像忽略该选项一样):搜索提示显示多个输入字符,但不显示单个字符。
我在SearchView
的配置/初始化中遗漏了什么吗?喜欢我可以设置的android:searchSuggestThreshold
以外的选项吗?过去几个小时我一直在寻找替代方案,但找不到任何替代方案。
我看到的一个可能的解决方案是让AutoCompleteTextView
支持SearchView
的输入并将其阈值设置为1,但这是一个丑陋(hack-ish)的解决方案,因为AutoCompleteTextView
不是由SearchView
s 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 提示未显示的主要内容,如果未能解决你的问题,请参考以下文章