【发布时间】: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 设置为 0 和 1 并得到相同的结果(就像忽略该选项一样):搜索提示显示多个输入字符,但不显示单个字符。
我在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