android searchview setOnActionExpandListener on Honeycomb 3.2

android, android-3.0-honeycomb, android-actionbar, java, searchview

Solution

You probably missed the fact (like I did) that `MenuItemCompat.OnActionExpandListener' interface has a static implementation, and is not an instance method.

So, if you have a class that implements `MenuItemCompat.OnActionExpandListener` then in that class you need to install it as the listener like this:

MenuItem menuItem =  menu.findItem(R.id.search);
if (menuItem != null) {
  MenuItemCompat.setOnActionExpandListener(menuItem,this);
  MenuItemCompat.setActionView(menuItem, mSearchView);
}

The same paradigm applies to setActionView ... rather than invoke `menuItem.setActionView(this)`, you pass the menuItem as the first argument to the static version `MenuItemCompat.setActionView` and follow with the other argument(s).

Problem

I'm developing an app for Android 3.2 and greater with `android-support-v4`. I need to implement `OnActionExpandListener` for "intercept" when SearchView in the actionbar is expanded and when is collapsed. My code for Android 4.0 and higher it's ok, but for 3.2 no. menu.xml ``` <item android:id="@+id/menu_search" android:title="@string/menu_search" android:icon="@android:drawable/ic_menu_search" android:showAsAction="collapseActionView|always" android:actionViewClass="android.widget.SearchView" /> ``` MyActivity.java ``` @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.reader, menu); final MenuItem searchMI = menu.findItem(R.id.menu_search); if(searchView == null) { //searchView = (SearchView) searchMI.getActionView(); searchView = (SearchView) MenuItemCompat.getActionView(searchMI); searchView.setOnQueryTextListener(this); searchView.setOnSuggestionListener(this); searchView.setOnCloseListener(new OnCloseListener() { @Override public boolean onClose() { //some code return false; } }); } int currentapiVersion = android.os.Build.VERSION.SDK_INT; if (currentapiVersion <= android.os.Build.VERSION_CODES.HONEYCOMB_MR2) { MenuItemCompat.setShowAsAction(searchMI, MenuItemCompat.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW | MenuItemCompat.SHOW_AS_ACTION_ALWAYS); MenuItemCompat.setOnActionExpandListener(searchMI, new OnActionExpandListener() { /* (non-Javadoc) * @see android.support.v4.view.MenuItemCompat.OnActionExpandListener#onMenuItemActionExpand(android.view.MenuItem) */ @Override public boolean onMenuItemActionExpand(MenuItem item) { Toast.makeText(getApplicationContext(), "onMenuItemActionExpand", Toast.LENGTH_SHORT).show(); return true; } /* (non-Javadoc) * @see android.support.v4.view.MenuItemCompat.OnActionExpandListener#onMenuItemActionCollapse(android.view.MenuItem) */ @Override public boolean onMenuItemActionCollapse(MenuItem item) { Toast.makeText(getApplicationContext(), "onMenuItemActionExpand", Toast.LENGTH_SHORT).show(); return true; } }); } else { searchMI.setOnActionExpandListener(new MenuItem.OnActionExpandListener() { @Override public boolean onMenuItemActionExpand(MenuItem item) { Toast.makeText(getApplicationContext(), "MenuItem#onMenuItemActionExpand", Toast.LENGTH_SHORT).show(); return true; } @Override public boolean onMenuItemActionCollapse(MenuItem item) { Toast.makeText(getApplicationContext(), "MenuItem#onMenuItemActionExpand", Toast.LENGTH_SHORT).show(); return true; } }); } } ``` Why, for Honeycomb, methods of listener is not invoked? Thank you so much.

Original source