Android searchview setOnActionExpandListener en Honeycomb 3.2

Estoy desarrollando una aplicación para Android 3.2 y superior con android-support-v4 . Tengo que implementar OnActionExpandListener para "interceptar" cuando SearchView en la barra de acción se expande y cuando se colapsa. Mi código para Android 4.0 y superior es aceptable, pero para 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; } }); } } 

¿Por qué, para Honeycomb, los métodos de oyente no se invoca?

Muchas gracias.

Probablemente se perdió el hecho (como lo hice) de que la interfaz `MenuItemCompat.OnActionExpandListener 'tiene una implementación estática, y no es un método de instancia.

Por lo tanto, si tiene una clase que implemente MenuItemCompat.OnActionExpandListener entonces en esa clase necesita instalarlo como el listener como este:

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

El mismo paradigma se aplica a setActionView … en lugar de invocar menuItem.setActionView(this) , se pasa el menuItem como el primer argumento a la versión estática MenuItemCompat.setActionView y se sigue con el otro argumento (s).

Para que MenuItemCompat.setOnActionExpandListener funcione, debe agregar " collapseActionView " agregado en el elemento de menú – por ejemplo –

 <item android:id="@+id/action_search" android:icon="@drawable/ic_action_search" android:title="@string/action_search" app:showAsAction="ifRoom|collapseActionView" app:actionViewClass="android.support.v7.widget.SearchView" /> 

Y en el onCreateOptionsMenu puedes usarlo de esta manera –

 MenuItemCompat.setOnActionExpandListener(menu_search, new OnActionExpandListener() { @Override public boolean onMenuItemActionCollapse(MenuItem item) { // Do something when collapsed return true; // Return true to collapse action view } @Override public boolean onMenuItemActionExpand(MenuItem item) { // Do something when expanded return true; // Return true to expand action view } }); 

He encontrado que MenuItemCompat.setOnActionExpandListener(...) no funciona si no pasa:

  searchItem .setShowAsAction(MenuItemCompat.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW | MenuItemCompat.SHOW_AS_ACTION_ALWAYS); 

Pero esto está cambiando el SearchView y está substituyendo el DrawerToggle con la flecha trasera.

Quise conservar las vistas originales y seguir el estado expandido / contraído y utilizar la vista de búsqueda admitida.

Solución:

Cuando android.support.v7.widget.SearchView está cambiando el estado de vista de la vista LinearLayout, con id android.support.v7.appcompat.R.id.search_edit_frame , el valor de visibilidad se cambia de View.VISIBLE a View.GONE y opuesto . Entonces agrego ViewTreeObserver para seguir el cambio de la visibilidad del marco de la edición de la búsqueda.

Menu_search.xml:

 <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" > <item android:id="@+id/action_search" android:icon="@android:drawable/ic_menu_search" android:title="@string/search" app:actionViewClass="android.support.v7.widget.SearchView" app:showAsAction="always"/> </menu> 

En la actividad:

 import android.support.v4.view.MenuItemCompat; import android.support.v7.widget.SearchView; import android.view.Menu; import android.view.MenuItem; .......... private View mSearchEditFrame; @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_search, menu); MenuItem searchItem = (MenuItem) menu.findItem(R.id.action_search); SearchView searchView = (SearchView) MenuItemCompat .getActionView(searchItem); searchView.setSubmitButtonEnabled(false); mSearchEditFrame = searchView .findViewById(android.support.v7.appcompat.R.id.search_edit_frame); ViewTreeObserver vto = mSearchEditFrame.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { int oldVisibility = -1; @Override public void onGlobalLayout() { int currentVisibility = mSearchEditFrame.getVisibility(); if (currentVisibility != oldVisibility) { if (currentVisibility == View.VISIBLE) { Log.v(TAG, "EXPANDED"); } else { Log.v(TAG, "COLLAPSED"); } oldVisibility = currentVisibility; } } }); return super.onCreateOptionsMenu(menu); } 

¡Gracias!

Su oyente debe ser MenuItemCompat.OnActionExpandListener ().

 MenuItemCompat.setOnActionExpandListener(searchItem, new MenuItemCompat.OnActionExpandListener() { } 

Gracias por su ayuda, su solución es el trabajo para mí. Y me gustaría votar por usted, pero acabo de darme cuenta de que sólo tengo una reputación, (; ⌒ ⌒)

En realidad, mi solución es similar a su, sólo hay una diferente en el archivo de menú xml como este:

  <item android:id="@+id/apps_menu_search" android:icon="@drawable/ic_action_search" android:title="@string/apps_menu_search" android:visible="true" app:actionViewClass="android.support.v7.widget.SearchView" app:showAsAction="ifRoom|collapseActionView" /> 
  • Mejores Prácticas para el Manejo de la Búsqueda
  • La vista de búsqueda no responde cuando se hace clic en la barra de herramientas de AppCompat
  • Mostrar icono de micrófono en SearchView siempre
  • Cómo agregar espacio a la sugerencia de AutoCompleteTextView
  • ¿Es posible buscar dentro de Fragmentos?
  • Android SearchView onclick
  • Android: evita el truncamiento de texto en las sugerencias de SearchView?
  • Cambiar el texto de SearchView y el color de la sugerencia de appcompat
  • ¿Cómo manejar el evento de clic de sugerencia con SearchView en ActionBar, ContentProvider llamando a webService, devolviendo el cursor?
  • Cómo descartar el teclado en Android SearchView?
  • Obtención de excepción de conversión de clase durante el uso de android.support.v7.widget.SearchView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.