【发布时间】:2017-12-19 13:46:04
【问题描述】:
我有一个 Activity 应用程序,我在顶部栏上放了一个 SearchView。我正在苦苦挣扎,因为有成千上万的关于实现在线搜索的手册/教程,但它们似乎都已经过时了。甚至官方文档也没有对我说清楚。
出于某种原因,我必须在我的应用程序中使用单个Activity,并处理与Fragment 的整个交互。
我正在努力使SearchView 表现得像我想要的那样:我希望菜单项在我单击它时在顶部显示搜索栏,然后提供历史记录和建议,然后每当搜索某些内容时,用结果打开一个不同的Fragment(实际上是一个带有三种不同结果类型的TabLayout)——我认为Youtube就是这样。
我已经到了搜索某些东西会在屏幕上显示另一个 Fragment 的地步,但是我希望当用户单击后退箭头时,用户会回到以前的 Fragment(没有它重新加载信息 - 无限滚动,因此用户可能已经加载了大量数据):每当我点击时,首先搜索的操作视图会消失,然后如果我再次点击,之前的 Fragment 会出现,但它是重新加载其内容。
这是我的 setupSearch() 方法:
private fun setupSearch(menu: Menu) {
// Get the SearchView and set the searchable configuration
val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager
val searchItem = menu.findItem(R.id.app_search)
val searchView = searchItem.actionView as SearchView
// Assumes current activity is the searchable activity
searchView.setSearchableInfo(searchManager.getSearchableInfo(componentName))
var searchEditTextId = R.id.search_src_text;
var searchEditText = searchView.findViewById<AutoCompleteTextView>(searchEditTextId)
var dropDownAnchor = searchView.findViewById<View>(searchEditText.dropDownAnchor)
if (dropDownAnchor != null) {
dropDownAnchor.addOnLayoutChangeListener { p0, p1, p2, p3, p4, p5, p6, p7, p8 ->
// screen width
var screenWidthPixel = this@DashboardListActivity.resources.displayMetrics.widthPixels
searchEditText.dropDownWidth = screenWidthPixel
}
}
searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
override fun onQueryTextSubmit(query: String): Boolean {
var searchSuggestion = SearchRecentSuggestions(this@DashboardListActivity, SearchHistoryProvider.AUTHORITY, SearchHistoryProvider.MODE)
searchSuggestion.saveRecentQuery(query, null)
supportFragmentManager
.beginTransaction()
.replace(R.id.fragment_container, SearchResultsContainerFragment.newInstance())
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
.addToBackStack("SEARCH")
.commit()
return false
}
override fun onQueryTextChange(newText: String): Boolean {
return false
}
})
searchItem.setOnActionExpandListener(object : MenuItem.OnActionExpandListener{
override fun onMenuItemActionExpand(item: MenuItem): Boolean {
return true
}
override fun onMenuItemActionCollapse(item: MenuItem): Boolean {
return true
}
})
searchView.setOnSuggestionListener(object: SearchView.OnSuggestionListener {
override fun onSuggestionSelect(position: Int): Boolean {
return false
}
override fun onSuggestionClick(position: Int): Boolean {
return false
}
})
}
此外,在显示建议列表时,Activity 似乎以某种方式暂停和恢复(我猜是因为它是作为dialog 实现的?)。这不是问题,但我始终在所有视图之上保留一个视频窗口(因此我需要使用Fragment 做所有事情)并且视频停止一秒然后继续。有没有可能防止这种情况发生?
搜索似乎是一件容易的事,但它却变成了一场噩梦。官方文档说我必须创建一个不同的“可搜索”Activity,但我不能这样做。
【问题讨论】:
-
这不是什么大问题。您只需要检查当前可见的片段并将
QueryText发送到该片段并过滤该可见片段的列表。 -
好像有多个问题,能隔离主要的吗?
标签: android android-fragments searchview