studio how example ejemplo bar actionbar android searchview

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:

  1. 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); } }

  1. 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"/>

  1. 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 :

Los doctores dicen :

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);


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();