在导航上清除Searchview文本。

时间:2015-04-14 10:58:10

标签: android android-actionbar-compat android-search

我有一个包含两个子片段TimelineMilestones的活动。这两个片段都包含由自定义Cursor适配器填充的列表视图

这是一个图形表示:enter image description here

现在,当我在TIMELINE上打开搜索视图时,我输入的内容一切都很好,我得到了理想的结果。但是当我使用some text in the searchview从时间轴导航到里程碑时,搜索视图不会被清除,因此我也会在里程碑页面上获得过滤结果,并根据我在时间轴中提供的参数。

我正在使用AppCompact lib来开发我的ActionBar。其中的选项卡不是ActionBar选项卡,而是简单的SlidingTabLayout

到目前为止,我已尝试使用

getActivity()supportInvalidateOptionsMenu();在两个片段的onResume()中,不起作用。

我尝试过searchView.setQuery(“”,false) - 不起作用并随机给我一个NPE。

那我在这里想念什么?

1 个答案:

答案 0 :(得分:0)

您可以看一下我的示例,其中展示了如何控制片段之间的searchView。

首先。您需要创建BaseFragment,它可以与appBarLayout的活动上下文一起使用。

open class BaseFragment: Fragment() {
    lateinit var rootActivity: MainActivity
    lateinit var appBarLayout: AppBarLayout
    lateinit var searchView: androidx.appcompat.widget.SearchView

    override fun onAttach(context: Context) {
        super.onAttach(context)

        this.rootActivity = context as MainActivity
        appBarLayout = rootActivity.findViewById(R.id.app_bar_layout)
        searchView = rootActivity.findViewById(R.id.search_input)
    }

    override fun onResume() {
        super.onResume()

        resetAppBarLayout()
    }

    private fun resetAppBarLayout() {
        appBarLayout.elevation = 14f
    }

    fun setupSearch(query: String) {
        searchView.visibility = View.VISIBLE
        searchView.clearFocus()
        when(query.isNotEmpty()) {
            true -> {
                searchView.setQuery(query, true)
                searchView.isIconified = false
            }
            false -> {
                searchView.isIconified = true
                searchView.isIconified = true
            }
        }
    }

    fun hideSearchKeyboard() {
        context?.let {
            KeyboardHelper.hideSearchKeyboard(it, searchView.findViewById(R.id.search_src_text))
        }
    }

    fun hideSearch() {
        searchView.visibility = View.GONE
        searchView.clearFocus()
    }
}

第二。从BaseFragment继承片段,重写onResume()方法并通过从BaseFragment调用方法来控制片段中的searchView。像这样的东西。

class FragmentA : BaseFragment() {
    private var searchQuery = ""

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val root = inflater.inflate(R.layout.fragment, container, false)
        val textView: TextView = root.findViewById(R.id.textView)
        textView.text = "Fragment A"
        return root
    }

    override fun onResume() {
        super.onResume()

        setupSearch()
    }

    private fun setupSearch() {
        searchView.setOnQueryTextListener(object : androidx.appcompat.widget.SearchView.OnQueryTextListener {
            override fun onQueryTextChange(newText: String?): Boolean {
                when(newText.isNullOrEmpty()) {
                    true -> searchQuery = ""
                    false -> searchQuery = newText
                }
                return true
            }

            override fun onQueryTextSubmit(query: String?): Boolean {
                hideSearchKeyboard()
                return true
            }
        })

        super.setupSearch(searchQuery)
    }
}

完整示例,您可以在这里https://github.com/yellow-cap/android-manage-searchview