【问题标题】:SearchView with fragments带有片段的 SearchView
【发布时间】: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


【解决方案1】:

如果您不想在返回时重新加载片段(包含搜索),则必须使用添加更改替换片段。那是因为 replace 会删除(任何片段),然后是添加(新片段)。

【讨论】:

  • @MichelReap,下一个是什么?
  • 我有一个始终显示的视频窗口,当搜索历史显示视频由于活动 onPAusing 和 onResuming 而停止时
【解决方案2】:
猜你喜欢
  • 2015-10-29
  • 1970-01-01
  • 2019-07-31
  • 2015-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多