mSearchView.setOnCloseListener {
// do something
}
This method won't be called if the searchview contains some text. It is only called when the searchbox is empty.
UPDATE:
menu xml:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_scrolltotop"
android:icon="@drawable/ic_baseline_arrow_upward_24_white"
android:title="@string/action_scrolltotop"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_search"
android:icon="@android:drawable/ic_menu_search"
android:title="@string/action_search"
app:actionViewClass="android.widget.SearchView"
app:showAsAction="always" />
</menu>
I use navigation component so I inflate the menu from a fragment.
onCreateOptionsMenu (from a fragment):
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
super.onCreateOptionsMenu(menu, inflater)
inflater.inflate(R.menu.menu_memories_tools, menu)
val mSearch = menu.findItem(R.id.action_search)
mSearchView = mSearch.actionView as SearchView
mSearchView.setOnSearchClickListener {
memoriesScrollView.smoothScrollTo(0, 0)
}
val closeBtn = mSearchView.findViewById<ImageView>(R.id.search_close_btn)
closeBtn?.setOnClickListener {
mSearchView.setQuery("", false)
mSearchView.isIconified = true
}
mSearchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
...
}
}
Solution
val closeBtnId = mSearchView.context.resources
.getIdentifier("android:id/search_close_btn", null, null)
val closeBtn = mSearchView.findViewById<ImageView>(closeBtnId)
closeBtn?.setOnClickListener {
mSearchView.onActionViewCollapsed()
}