Estoy tratando de agregar soporte para SearchViewen la ActionBar de Android 3.0+, pero no puedo hacer OnCloseListenerque funcione.
Aquí está mi código:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu, menu);
    searchView = (SearchView) menu.findItem(R.id.search_textbox).getActionView();
    searchView.setOnQueryTextListener(new OnQueryTextListener() {
        @Override
        public boolean onQueryTextChange(String newText) {
            searchLibrary(newText);
            return false;
        }
        @Override
        public boolean onQueryTextSubmit(String query) { return false; }
    });
    searchView.setOnCloseListener(new OnCloseListener() {
        @Override
        public boolean onClose() {
            System.out.println("Testing. 1, 2, 3...");
            return false;
        }
    });
    return true;
}
La búsqueda funciona muy bien y todos funcionan excepto el OnCloseListener. No se imprime nada en Logcat. Aquí está el Logcat para cuando presiono el botón "Cerrar":
02-17 13:01:52.914: I/TextType(446): TextType = 0x0
02-17 13:01:57.344: I/TextType(446): TextType = 0x0
02-17 13:02:02.944: I/TextType(446): TextType = 0x0
Revisé la documentación y las muestras, pero nada pareció cambiarlo. Lo estoy ejecutando en un Asus Transformer Prime y un Galaxy Nexus, ambos en Ice Cream Sandwich. ¿Algunas ideas?
Actualizar:
Sí - System.out.println() hace el trabajo. Aquí tienes la prueba:
   @Override
 public boolean onQueryTextChange(String newText) {
    System.out.println(newText + "hello");
    searchLibrary(newText);
    return false;
 }
Resultados en este Logcat:
02-17 13:04:20.094: I/System.out(21152): hello
02-17 13:04:24.914: I/System.out(21152): thello
02-17 13:04:25.394: I/System.out(21152): tehello
02-17 13:04:25.784: I/System.out(21152): teshello
02-17 13:04:26.064: I/System.out(21152): testhello
                
showAsActionestá configuradoalways. El cuadro de búsqueda tiene un botón de cierre propio, pero si está configurado,ifRoom | collapseActionViewse expande en la barra de acciones.Respuestas:
También me encuentro con este problema, y no tengo más remedio que renunciar a "oncloselistener". En su lugar, puede obtener su menuItem, entonces
setOnActionExpandListener. Luego anule los métodos no implementados.fuente
if (Build.VERSION.SdkInt > BuildVersionCodes.NMr1) item.SetOnActionExpandListener(this); else MenuItemCompat.SetOnActionExpandListener(item, this);Para Android API 14+ (ICS y superior) use este código:
Para obtener más información: http://developer.android.com/guide/topics/ui/actionbar.html#ActionView
Ref: onActionCollapse / onActionExpand
fuente
Para este problema se me ocurrió algo como esto,
fuente
Me encontré con el mismo problema en Android 4.1.1. Parece que es un error conocido: https://code.google.com/p/android/issues/detail?id=25758
De todos modos, como solución, utilicé el oyente de cambio de estado (cuando SearchView se separa de la barra de acción, también se cierra obviamente).
El código anterior funcionó bien en mi caso.
Publico la misma respuesta aquí: https://stackoverflow.com/a/24573266/2162924
fuente
Terminé usando un truco que funciona bien para mi propósito, no estoy seguro de que funcione con todos los propósitos. De todos modos, estoy haciendo una verificación para ver si la consulta de búsqueda está vacía. Sin embargo, esto no está realmente relacionado con el de,
SearchView¡OnCloseListenereso todavía no funciona!fuente
Bueno, esto resolvió mi problema:
Elemento de menú con
showAsAction="always"y en actividad
fuente
alwaysvalor enshowAsActionatributo resuelve el problema. Lo importante es que cuando elalwaysvalor estáis notpresente enshowAsAction, expandidoSearchViewpresenta el botón de cierre (icono de cruz) solo si la consulta enSearchViewno es una cadena nula. ElSearchView.onCloseClickedque maneja los eventos del botón de cierre indica que la devolución de llamada aOnCloseListenerse llama solo si la consulta está vacía, si no lo está, se borra primero, pero luego, después de borrar la consulta, el botón de cierre desaparece y no podemosonCloseOnCloseListenerPara que el
OnCloseListenertrabajo funcione, asegúrese de queshowAsActionesté configurado enalwaysen el elemento del menú de búsqueda.fuente
Me he encontrado con el mismo problema con onCloseListener que no invoca el SearchView. Comprenda el problema del error planteado en 25758 , y algunas publicaciones que he leído, para invocar onCloseListener, debe configurar:
Pero para mi caso, quería tener la vista de búsqueda abierta y no iconificada todo el tiempo. Me las arreglo para resolver esto agregando una línea más a continuación:
El searchView.setIconified (false) hará que el searchView se abra, a pesar de establecer el valor predeterminado en iconified como verdadero en la línea anterior. De esta manera, logré tener un SearchView que se abre todo el tiempo y que invoque el onCloseListener.
fuente
Cree el elemento del menú con el
app:showAsActionajuste siempre.Al crear el
SearchViewen elonCreateOptionsMenumétodo, haga algo similarLas
search.setIconifiedByDefault(true)necesidades que se establezcan atruellamar alonClose()método en laSearchView.OnCloseListener()creada anteriormente.fuente
Por
MenuItemCompatproblema, agregué ViewTreeObserver para rastrear el estado de visibilidad. Puede consultar mi respuesta aquí: https://stackoverflow.com/a/28762632/1633609fuente
La razón por la
OnCloseListenerque no se llama es porque hay un error en el código de Android: solo se llama al oyente si también llamasetIconifiedByDefault(true).fuente
Ya parece un hilo antiguo, pero pensé que tenía el mismo problema API 18 al principio. Después de buscar en Google, encontré este hilo, otra hora leyó el javadoc probado y erró por algo que no pretendo entender completamente en javadoc, el siguiente trabajo para mí ahora:
Jugué un poco con verdadero / falso, eso de alguna manera hace la diferencia, y ahora funciona para mí. Con suerte, podría ahorrarle tiempo a alguien.
fuente
Es una solución pero me ha funcionado
fuente
si hace clic en cerrar searchView ->
D / clic: cerrar clic
fuente
Encontré este problema al intentar detectar la visualización o el rechazo de SearchView. Terminé usando un oyente diferente y funcionó para lo que necesito:
fuente
Usé el botón de cierre de SearchView y configuré un setOnClickListener en él
fuente
No hay ninguna consola en Android para iniciar sesión. En su lugar, use el marco de registro de Android:
Consulte también esta pregunta: ¿Por qué "System.out.println" no funciona en Android?
fuente
Hay dos patrones comunes para
SearchView.setOnCloseListener(). Esto es realmente cierto para todos los oyentes, pero me dirijo a su pregunta específicamente. La primera forma es crear una función de escucha y adjuntarla a una variable miembro, y la segunda es hacer que la clase implemente la interfaz y que el controlador sea una función miembro.La creación de un objeto de escucha se ve así:
La implementación del oyente a nivel de clase se ve así:
No he visto ningún ejemplo que cree el
OnCloseListenerad-hoc, como lo hizo en su pregunta.fuente