SearchView与片段

问题描述 投票:2回答:2

我有一个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,但我不能这样做。

android android-fragments searchview
2个回答
1
投票

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


© www.soinside.com 2019 - 2024. All rights reserved.