Actualmente estoy usando un elemento del menú ActionBar para mostrar un SearchView en la barra de acciones. Cuando se expande el elemento del menú de búsqueda, se muestra el teclado virtual, que es lo que quiero. Ahora, cuando el usuario presiona el botón Atrás para cerrar el teclado en pantalla, también me gustaría colapsar SearchView en la barra de acción.
Intenté implementar los siguientes oyentes OnKeyListener y OnFocusChangeListener en MenuItem y ActionView. También intenté usar OnBackPressed () en la Actividad. Ninguno de los anteriores detecta cuándo se usa el botón Atrás para cerrar el teclado virtual.
¿Algunas ideas?
Implementé OnActionExpandListener para saber cuándo está visible SearchView.
android
android-actionbar
android-softkeyboard
usuario1258568
fuente
fuente
Respuestas:
Ampliaré la respuesta de @ user1258568 para los vagos. Esto funcionó para mí. Tenga en cuenta que borra su consulta cuando se pierde el foco.
final MenuItem searchMenuItem = optionsMenu.findItem(R.id.search); final SearchView searchView = (SearchView) searchMenuItem.getActionView(); searchView.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View view, boolean queryTextFocused) { if(!queryTextFocused) { searchMenuItem.collapseActionView(); searchView.setQuery("", false); } } });
fuente
menu.getItem(yourSearchViewItemPosition)
en su lugar.setOnFocusChangeListener()
lugar desetOnQueryTextFocusChangeListener()
. Con tu método todo funciona bien. Gracias.Encontré una mejor solución.
searchView.setOnQueryTextFocusChangeListener().
Se
OnQueryTextFocusChangeListener
llama cuando el teclado se muestra u oculta. Se llama primero cuando se muestra el teclado y la vista de búsqueda tendrá el foco. Se vuelve a llamar cuandokeyboard
está oculto y la vista de búsqueda perderá el foco,close search view
luego puede usarmenuItem.collapseActionView().
fuente
OnQueryTextFocusChangeListener
NO se consiga llamar cuando se muestra u oculta el teclado. Se llama solo cuandosearchView
entra en foco o se desenfoca. Por lo tanto, cuandoSearchView
está enfocado por primera vez,OnQueryTextFocusChangeListener
se llama y también se muestra el teclado. Ahora, si se presiona el botón Atrás, el teclado se oculta peroOnQueryTextFocusChangeListener
no se llama. Al presionar el botón Atrás por segunda vez, sesearchView
colapsa yOnQueryTextFocusChangeListener
se llama.Simplemente anule onBackPressed así:
@Override public void onBackPressed() { if (searchView.isShown()){ searchView.onActionViewCollapsed(); //collapse your ActionView searchView.setQuery("",false); //clears your query without submit isClosed = true; //needed to handle closed by back } else{ super.onBackPressed(); } }
y su onCreateOptionsMenu inflaría el mSearchView de esta manera:
@Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); getMenuInflater().inflate(R.menu.menu_search, menu); mSearchView = (SearchView) menu.findItem(R.id.menu_action_search).getActionView(); mSearchView.setOnQueryTextListener(this); mSearchView.setOnSearchClickListener(this); mSearchView.setOnCloseListener(this); isClosed = true; return true; }
¿Ha implementado su clase lo siguiente así:
public class myActivity extends FragmentActivity implements SearchView.OnQueryTextListener, View.OnClickListener, SearchView.OnCloseListener {
que también necesitarás:
@Override public void onClick(View view) { isClosed = false; } @Override public boolean onClose() { isClosed = true; return false; }
Deberá hacer que "mSearchView" y "isClosed" sean ambas variables globales para la actividad.
fuente
La respuesta de Jon Willis funciona muy bien. Esta es una mejora a su respuesta.
Primero, cree una nueva clase que implemente
View.OnFocusChangeListener
:public class SearchViewFocusListener implements View.OnFocusChangeListener { private final MenuItem mMenuItem; public SearchViewFocusListener(MenuItem menuItem) { mMenuItem = menuItem; } @Override public void onFocusChange(View v, boolean hasFocus) { if (!hasFocus) { mMenuItem.collapseActionView(); if (v instanceof SearchView) { ((SearchView) v).setQuery("", false); } } } }
A continuación, configure el oyente en su
SearchView
:searchView.setOnQueryTextFocusChangeListener(new SearchViewFocusListener(menuItem));
fuente
Solo necesita poner el atributo "collapseActionView" en el diseño del menú
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/menu_item_search" android:title="@string/search" android:iconifiedByDefault="true" android:icon="@drawable/ic_action_search" app:actionViewClass="android.support.v7.widget.SearchView" app:showAsAction="ifRoom|collapseActionView"/> <--this one </menu>
Eso le dará la funcionalidad que busca por sí solo. No olvide llamar al método "clearFocus" en SearchView para cerrar el teclado una vez que envíe la consulta.
fuente
Esto es lo que hice para hacer desaparecer el teclado. Puede intentar ver si esto funciona para usted. Configuré el
searchView
en invisible y luego en visible nuevamente.//set query change listener searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener(){ @Override public boolean onQueryTextChange(String newText) { // TODO Auto-generated method stub return false; } @Override public boolean onQueryTextSubmit(String query) { /** * hides and then unhides search tab to make sure keyboard disappears when query is submitted */ searchView.setVisibility(View.INVISIBLE); searchView.setVisibility(View.VISIBLE); return false; } });
fuente
Se puede lograr así:
private void setupSearchView(Menu menu) { final MenuItem searchMenuItem = menu.findItem(R.id.action_search); final SearchView searchView = (SearchView) searchMenuItem.getActionView(); [...] searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { searchMenuItem.collapseActionView(); return false; } @Override public boolean onQueryTextChange(String newText) { return true; } }); }
Las soluciones basadas en setOnQueryTextFocusChangeListener () no funcionaron para mí porque el evento no se lanzó; el searchView no perdió el foco cuando se envió, probablemente porque realizo la búsqueda en la misma actividad que contiene el Search View.
De todos modos, creo que usar OnQueryTextListener es más correcto, ya que describe el evento de enviar texto con mayor precisión.
fuente
@Override public boolean onCreateOptionsMenu(Menu menu) { getSupportMenuInflater().inflate(R.menu.home_screen, menu); SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); final MenuItem searchMenuItem = menu.findItem(R.id.menu_search); final SearchView searchView = (SearchView) searchMenuItem .getActionView(); searchView.setIconifiedByDefault(false); if (searchManager != null && searchView != null) { searchView.setSearchableInfo(searchManager .getSearchableInfo(getComponentName())); searchView .setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (!hasFocus) { if (searchMenuItem != null) { searchMenuItem.collapseActionView(); }// end if if (searchView != null) { searchView.setQuery("", false); }// end if }// end if } }); searchView .setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { /** * hides and then unhides search tab to make sure * keyboard disappears when query is submitted */ if (searchView != null) { searchView.setVisibility(View.INVISIBLE); searchView.setVisibility(View.VISIBLE); } return false; } @Override public boolean onQueryTextChange(String newText) { // TODO Auto-generated method stub return false; } }); } return super.onCreateOptionsMenu(menu); }
fuente
Si desea contraer el teclado cuando el usuario hace clic en el icono de búsqueda en el teclado, esto se puede lograr simplemente
inside onquerytextsubmitted {
searchView.clearfocus()
}
fuente
Debe llamar a setIconified dos veces.
Para contraer realmente la vista de búsqueda y cerrar el teclado.
Con la primera llamada, el texto de la vista de búsqueda se borra con el teclado de la segunda llamada y la vista de búsqueda se cierra.
fuente
Por alguna razón,
menuItem.collapseActionView()
no funcionó, así que usé en susearchView.setIconified(true)
lugar.Esto da el resultado siguiente como ejemplo de código.
final MenuItem searchItem = (MenuItem) menu.findItem(R.id.menu_item_search); final SearchView searchView = (SearchView) searchItem.getActionView(); searchView.setOnQueryTextFocusChangeListener(new SearchView.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (!hasFocus) { searchView.setIconified(true); } } });
fuente