我有一个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 = [email protected]
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
,但我不能这样做。
如果您不希望在返回时重新加载片段(包含搜索),则必须使用add更改替换片段。这是因为replace会删除(任何片段),然后是add(新片段)。