【问题标题】:How to add QueryTextListener for searchView in android fragment?如何在 android 片段中为 searchView 添加 QueryTextListener?
【发布时间】:2021-02-19 13:32:57
【问题描述】:

我有一个应用内联系人列表屏幕(这是一个片段),我想在我的工具栏中添加一个 searchView。这是我的代码:

片段代码:

    private lateinit var contactsToolbar: Toolbar

      override fun onCreateView(
            inflater: LayoutInflater, container: ViewGroup?,
            savedInstanceState: Bundle?
        ): View? {
        val rootView = inflater.inflate(R.layout.fragment_contacts, container, false)
        setHasOptionsMenu(true);
        contactsToolbar = rootView.findViewById(R.id.contacts_toolbar)
        contactsToolbar.inflateMenu(R.menu.contacts_menu)
        contactsToolbar.title = "Contacts"
.......
      return rootView
    }

override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.contacts_menu, menu)
val search = menu.findItem(R.id.action_search)
val searchView = search.actionView as SearchView

searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
    override fun onQueryTextSubmit(query: String?): Boolean {
        Log.d(TAG, "new query $query")
        return true
    }

    override fun onQueryTextChange(newText: String?): Boolean {
        Log.d(TAG, "new text $newText")
        return true
    }
})
super.onCreateOptionsMenu(menu, inflater)

}

这是我的菜单

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <item
        android:id="@+id/action_search"
        android:icon="@android:drawable/ic_menu_search"
        app:showAsAction="always|collapseActionView"
        app:actionViewClass="androidx.appcompat.widget.SearchView"
        android:title="Search"/>
</menu>

我可以看到 searchView 按预期显示在 Fragmanet 中,但 queryTextListener 从未被调用。有谁知道为什么会这样? 提前谢谢!

【问题讨论】:

    标签: android mobile menu toolbar searchview


    【解决方案1】:

    应该是这样的

    search.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
        override fun onQueryTextSubmit(query: String): Boolean {
                Log.i(TAG,"Press querysubmit")
                return false
        }
        override fun onQueryTextChange(newText: String): Boolean {
                Log.i(TAG,"Press querytextchange")
                return true
        }
    })
    

    【讨论】:

      【解决方案2】:

      你可以在 onCreateOptionsMenu 方法之后初始化 SearchView 吗?

      我不能确定这是真的,但我遇到了和你一样的问题,文本监听器不起作用。

      因为我像这样初始化我的 SearchView

      val mySearchView by lazy{ ... }

      【讨论】:

        【解决方案3】:

        找到了解决办法!不确定是否是最优雅的,但将来可能会对某人有所帮助。这是修复:

        1. onCreateView添加这行代码:

        yourActivity().setSupportActionBar(contactsToolbar)

        1. 这将使 searchView 侦听器工作,但如果您有一个,它可能会显示活动中的菜单。为了防止这种情况发生,请在添加菜单之前在onCreateOptionsMenu 中添加此行。

          menu.clear()

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-10-12
          • 1970-01-01
          • 1970-01-01
          • 2020-03-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多