如何在 android 片段中为 searchView 添加 QueryTextListener?

How to add QueryTextListener for searchView in android fragment?

我有一个应用内联系人列表屏幕(这是一个片段),我想在我的工具栏中添加一个 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。有谁知道为什么会这样? 提前致谢!

应该是这样的

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
    }
})

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

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

因为我像这样初始化 SearchView

通过 lazy 验证 mySearchView{ ... }

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

  1. onCreateView中添加这行代码:

yourActivity().setSupportActionBar(contactsToolbar)

  1. 这将使 searchView 侦听器工作,但它可能会显示来自 activity 的菜单(如果您有的话)。为防止这种情况发生,请在 onCreateOptionsMenu 中添加此行,然后再展开菜单。

    menu.clear()