example - searchview android how to use
¿Cómo cierro un SearchView programáticamente? (11)
Hay una manera simple de hacer esto:
@Override
public void onBackPressed() {
if (!searchView.isIconified()) {
searchView.onActionViewCollapsed();
} else {
super.onBackPressed();
}
}
o usar:
@Override
public void onBackPressed() {
searchView.onActionViewCollapsed();
super.onBackPressed();
}
Esto hará que la vista de búsqueda se colapse antes de presionar la parte posterior; luego se invocará la acción hacia atrás.
Ambas soluciones funcionarán.
Actualmente tengo un SearchView
en la barra de acciones de mi aplicación. Cuando hago clic en el ícono de búsqueda, SearchView
expande y el teclado aparece como se esperaba. Al hacer clic en la "X" en el cuadro de SearchView
, se cierra SearchView
como se esperaba. Sin embargo, cuando SearchView
está activado y SearchView
el botón "Atrás", mi aplicación se cierra. Este es el comportamiento correcto, pero lo que estoy tratando de hacer ahora es capturar presionar botón atrás y hacer que cierre el SearchView
(no mi aplicación) cuando el SearchView
esté visible. ¿Hay alguna manera de invocar el OnCloseListener()
programáticamente en un botón de retroceso presionar? Por ejemplo, algo como esto:
// On a back button press, if we are currently searching,
// close the SearchView. Otherwise, invoke normal back button
// behavior.
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (isSearchViewVisible) {
SearchView searchView = (SearchView) menu.findItem(R.id.searchBox)
.getActionView();
// This method does not exist
searchView.invokeClose();
return true;
}
}
return super.onKeyDown(keyCode, event);
}
Mi manera:
- Crear clase CustomSearchView
public class CustomSearchView extends SearchView{ public CustomSearchView(final Context context) { super(context); this.setIconifiedByDefault(true); } @Override public boolean dispatchKeyEventPreIme(KeyEvent event) { if (event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) { this.onActionViewCollapsed(); } return super.dispatchKeyEventPreIme(event); } }
- Añadir actionViewClass
<item android:id="@+id/menu_search" android:title="@string/menu_search" android:icon="@drawable/ic_search" android:showAsAction="collapseActionView|ifRoom" android:actionViewClass="com.myapp.CustomSearchView"/>
- Crear CustomSearchView en onCreateOptionsMenu
CustomSearchView searchView = (CustomSearchView)menu.findItem(R.id.menu_search).getActionView();
Para interceptar la anulación del botón ATRÁS onBackPressed()
( ver documentos )
@Override
public void onBackPressed() {
if (isSearchViewVisible) {
SearchView searchView = (SearchView) menu.findItem(R.id.searchBox)
.getActionView();
// This method does not exist
searchView.invokeClose();
} else {
super.onBackPressed();
}
}
EDITAR :
Si es necesario, puede expandir o colapsar la vista de acción en su propio código llamando a expandActionView () y collapseActionView () en el MenuItem.
Prefiero !searchView.isIconified()
sobre if(isSearchViewVisible)
dentro del método onBackPressed()
ya que la opción 2 no funciona cuando tienes fragmentos agregados en fragmentmanager''s
backstack
tu backstack
fragmentmanager''s
que deseas mostrar cuando se presiona el botón Atrás.
Según la respuesta de @MarcinOrlowski, también puedes usar:
@Override
public void onBackPressed() {
if (!searchView.isIconified()) {
searchView.setIconified(true);
} else {
super.onBackPressed();
}
}
Si no usa ninguna función en el método onBackPressed()
, elimínelo de su Activity.So que onBackPress
maneje el evento onBackPress
.
Estoy usando SearchView como
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
MenuItem searchItem = menu.findItem(R.id.action_search);
SearchView searchview = (SearchView) MenuItemCompat.getActionView(searchItem);
searchview.setIconifiedByDefault(true);
searchview.setOnQueryTextListener(this);
searchview.setSubmitButtonEnabled(true);
searchview.setQueryHint("Search Here");
super.onCreateOptionsMenu(menu, inflater);
}
y mi menu.xml de la siguiente manera
<item
android:id="@+id/action_search"
android:icon="@drawable/search_tool"
android:orderInCategory="1"
android:title="Search"
app:actionViewClass="android.support.v7.widget.SearchView"
app:showAsAction="always|collapseActionView"/>
También puedes usar collapseActionView
. Automáticamente maneja el botón Atrás, colapsando SearchView
<item
android:id="@+id/action_search"
android:icon="@drawable/ic_magnify"
android:title="@string/action_title_search"
app:actionViewClass="android.support.v7.widget.SearchView"
app:showAsAction="ifRoom|collapseActionView" />
Utilizar
searchView.setIconified(true)
También utilicé MenuItemCompat.collapseActionView
MenuItemCompat.collapseActionView(menuItem)
Utilizar:
searchView.setIconified(true);
esto es lo único que lo hace por mí:
toolbar.collapseActionView();
si tiene información sobre su búsquedaVer
mSearchView.setIconified(true);
solo borrará el texto.
El método correcto para cerrar una búsqueda es
mSearchView.onActionViewCollapsed();