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
- ¿Cómo mantener expandido SearchView en el lado derecho de ActionBar (mientras se utiliza el icono personalizado)?
- Android abs con SearchView, onQueryTextListener no funciona
- Puntero nulo en ExpandedView para la búsqueda de ActionBar
- No se puede mostrar el teclado automáticamente en el SearchView
- Android: no puede encontrar TextView dentro de SearchWidget cuando usa la biblioteca de soporte técnico de Android
<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.
- MenuItemCompat.setOnActionExpandListener no hace nada
- ¿Cómo implementar WhatsApp como el diseño de materiales SearchView?
- SearchView en AppCompat distorsiona el icono
- Cómo descartar / cerrar / contraer SearchView en ActionBar en MainActivity?
- No se puede obtener la vista de búsqueda en la barra de acciones para trabajar
- Android - vista de búsqueda con función completa automática dentro de la barra de acción
- SearchView fuente personalizada en android
- SearchView es invisible con el parámetro collapseActionView desde la biblioteca de diseño 24.1
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" />
- Cómo establecer un título para spinner que no es seleccionable ..?
- Cómo iniciar la actividad de Android AppWidget?