Estoy tratando de agregar soporte para SearchView
en la ActionBar de Android 3.0+, pero no puedo hacer OnCloseListener
que 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
showAsAction
está configuradoalways
. El cuadro de búsqueda tiene un botón de cierre propio, pero si está configurado,ifRoom | collapseActionView
se 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
¡OnCloseListener
eso todavía no funciona!fuente
Bueno, esto resolvió mi problema:
Elemento de menú con
showAsAction="always"
y en actividad
fuente
always
valor enshowAsAction
atributo resuelve el problema. Lo importante es que cuando elalways
valor estáis not
presente enshowAsAction
, expandidoSearchView
presenta el botón de cierre (icono de cruz) solo si la consulta enSearchView
no es una cadena nula. ElSearchView.onCloseClicked
que maneja los eventos del botón de cierre indica que la devolución de llamada aOnCloseListener
se 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 podemosonClose
OnCloseListener
Para que el
OnCloseListener
trabajo funcione, asegúrese de queshowAsAction
esté configurado enalways
en 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:showAsAction
ajuste siempre.Al crear el
SearchView
en elonCreateOptionsMenu
método, haga algo similarLas
search.setIconifiedByDefault(true)
necesidades que se establezcan atrue
llamar alonClose()
método en laSearchView.OnCloseListener()
creada anteriormente.fuente
Por
MenuItemCompat
problema, agregué ViewTreeObserver para rastrear el estado de visibilidad. Puede consultar mi respuesta aquí: https://stackoverflow.com/a/28762632/1633609fuente
La razón por la
OnCloseListener
que 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
OnCloseListener
ad-hoc, como lo hizo en su pregunta.fuente