Search code examples
androidkotlinandroid-toolbarsearchview

How to handle clicking back arrow in SearchView in Toolbar


How to handle clicking back arrow enter image description here in androidx.appcompat.widget.SearchView?

enter image description here

I founded this answer: How to handle back arrow event in a SearchView but it isn't working for me. I set the menu from a fragment.

In MainActivity I have this functions:

override fun onOptionsItemSelected(item: MenuItem): Boolean
{
    Log.d("MyTag", "Activity")
    return super.onOptionsItemSelected(item)
}

override fun onSupportNavigateUp(): Boolean
{
    Log.d("MyTag", "Up")
    return navController.navigateUp()
}

In Fragment:

searchView.setOnQueryTextListener(
    object : SearchView.OnQueryTextListener
    {
        override fun onQueryTextSubmit(p0: String?): Boolean
        {
            Log.d("MyTag", "onQueryTextSubmit")
            hideKeyboard()
            return true
        }
        override fun onQueryTextChange(p0: String?): Boolean
        {
            return true
        }
    }
)

override fun onOptionsItemSelected(item: MenuItem): Boolean
{
    Log.d("MyTag", "Fragment")
    return super.onOptionsItemSelected(item)
}

None of these functions are called when I click the back arrow. Logcat looks like this:

// clicking search button
Activity  
Fragment

// clicking Enter on keyboard
onQueryTextSubmit

// clicking back arrow (Nothing)

// When I go to the next fragment and navigate back
Activity
Up

Why there isn't called any event when I click the back arrow in SearchView? How I can achieve this?


Thanks to Rustam Samandarov here is a full code of onCreateOptionsMenu:

override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater)
{
    super.onCreateOptionsMenu(menu, inflater)
    inflater.inflate(R.menu.menu_toolbar_home, menu)

    val menuItem = menu.findItem(R.id.itemSearch)
    val searchView = menuItem.actionView as SearchView

    searchView.setOnQueryTextListener(
        object : SearchView.OnQueryTextListener
        {
            override fun onQueryTextSubmit(p0: String?): Boolean
            {
                Log.d("MyTag", "onQueryTextSubmit") // called when enter is pressed
                hideKeyboard()
                return true
            }
            override fun onQueryTextChange(p0: String?): Boolean
            {
                return true // called every time when text is changed
            }
        }
    )

    menuItem.setOnActionExpandListener(
        object : MenuItem.OnActionExpandListener
        {
            override fun onMenuItemActionExpand(p0: MenuItem?): Boolean
            {
                Log.d("MyTag", "onMenuItemActionExpand") // called when user opens SearchView
                return true;
            }
            override fun onMenuItemActionCollapse(p0: MenuItem?): Boolean
            {
                Log.d("MyTag", "onMenuItemActionCollapse") // called when user click back arrow or navigation back button
                return true
            }
        }
    )
}

Solution

  • Hi you should set expend listener to the search view

    searchMenu.setOnActionExpandListener(
        object : MenuItem.OnActionExpandListener {
            override fun onMenuItemActionCollapse(item: MenuItem): Boolean {
                // Called when SearchView is collapsing
                // Custom code to run on back pressed
                return true
            }
    
            override fun onMenuItemActionExpand(item: MenuItem): Boolean {
                // Called when SearchView is expanding
                // Custom code to run on search view activated
                return true
            }
        })