¿Cómo descartar el teclado en Android SearchView?
android-actionbar android-3.0-honeycomb (11)
Para mí, ninguno de los anteriores estaba trabajando en el primer envío. Estaba escondido y luego volvió a mostrar el teclado de inmediato. Tuve que publicar clearFocus()
en el controlador de la vista para que suceda después de que se haya terminado con todo lo demás.
mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
if (!"".equals(query)) {
mSearchView.post(new Runnable() {
@Override
public void run() {
mSearchView.clearFocus();
}
});
}
return true;
}
@Override
public boolean onQueryTextChange(String newText) {
return false;
}
});
Tengo un searchView en la barra de acciones. Quiero descartar el teclado cuando el usuario haya terminado con la entrada. Tengo el siguiente queryTextListener en el searchView
final SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextChange(String newText) {
// Do something
return true;
}
@Override
public boolean onQueryTextSubmit(String query) {
showProgress();
// Do stuff, make async call
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
return true;
}
};
En función de preguntas similares, el siguiente código debería descartar el teclado, pero no funciona en este caso:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
También lo intenté:
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(searchView.getWindowToken(), 0);
Ninguno de los dos funciona No estoy seguro de si este es un problema específico de Honeycomb o si está relacionado con la búsqueda en la barra de acciones, o ambas cosas. ¿Alguien ha conseguido esto funcionando o sabe por qué no funciona?
De alguna manera funciona si llamas
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(searchView.getWindowToken(), 0);
y entonces
otherWidget.requestFocus();
Para mí, los siguientes trabajos:
En mi actividad tengo una variable miembro
private SearchView mSearchView;
En onCreateOptionsMenu()
configuré esa variable así:
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.library, menu);
mSearchView = (SearchView)menu.findItem(R.id.miSearch).getActionView();
mSearchView.setOnQueryTextListener(this);
return true;
}
En el QueryTextListener
por fin, hago esto:
mSearchView.setQuery("", false);
mSearchView.setIconified(true);
Eché un vistazo al código fuente de SearchView, y si no restablece el texto de la consulta a una cadena vacía, SearchView solo hace eso, y tampoco elimina el teclado. En realidad, profundizar lo suficiente en el código fuente, se trata de lo mismo, sugirió Yuku, pero aún así me gusta más mi solución, ya que no tengo que perder el tiempo con esas cosas de bajo nivel.
En una aplicación para tableta en la que estoy trabajando con una actividad de doble panel, solo escribí
f.getView().requestFocus(); // f is the target fragment for the search
y eso fue suficiente para descartar el teclado suave después de una búsqueda. No es necesario usar InputMethodManager
Usé ActionBarSherlock 4.3 y tengo un ProgressDialog. Cuando lo descarto en el método postExecute, Searchview gana foco. Para arreglar eso:
//Handle intent and hide soft keyboard
@Override
protected void onNewIntent(Intent intent) {
setIntent(intent);
handleIntent(intent);
searchView.setQuery("", false);
searchView.setIconified(true);
searchView.clearFocus();
}
/*When dismiss ProgressDialog, searchview gain focus again and shows the keyboard. I call clearFocus() to avoid it.*/
AsyncTask.onPostExecute(){
if(pd!=null)
pd.dismiss();
if(searchView!=null)
searchView.clearFocus();
}
Espero eso ayude.
Simple, directo al grano y limpio:
@Override
public boolean onQueryTextSubmit(String query) {
// your search methods
searchView.clearFocus();
return true;
}
Editar: agregué la mejor solución en la parte superior, pero también guardé la respuesta anterior como referencia.
@Override
public boolean onQueryTextSubmit(String query) {
searchView.clearFocus();
return false;
}
Respuesta original: programé usando setOnQueryTextListener. Cuando la vista de búsqueda está oculta, el teclado se va y luego, cuando vuelve a estar visible, el teclado no vuelve a aparecer.
//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;
}
});
simplemente devuelve falso en onQueryTextSubmit como abajo
@Override
public boolean onQueryTextSubmit(String s) {
return false;
}
Dos soluciones que funcionaron para mí, la primera que usaba la instancia de SearchView:
private void hideKeyboard(){
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(searchView.getWindowToken(), 0);
}
Segunda solución:
private void hideKeyboard(){
InputMethodManager inputManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
El código siguiente funciona para ocultar el teclado en Searchview
MenuItem searchItem = baseMenu.findItem(R.id.menuSearch);
edtSearch= (EditText) searchItem.getActionView().findViewById(R.id.search_src_text);
MenuItemCompat.setOnActionExpandListener(searchItem, new MenuItemCompat.OnActionExpandListener() {
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
edtSearch.post(new Runnable() {
@Override
public void run() {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(searchEditText.getWindowToken(), 0);
}
});
return true;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
return true;
}
});
Intentaba hacer algo similar. Necesitaba iniciar SearchActivity
desde otra Activity
y hacer que el término de búsqueda apareciera en el campo de búsqueda abierto cuando se cargaba. Intenté todos los enfoques anteriores, pero finalmente (similar a la respuesta de Ridcully anterior ) establecí una variable para onCreateOptionsMenu()
en onCreateOptionsMenu()
y luego en onQueryTextSubmit()
llamado clearFocus()
en SearchView
cuando el usuario envió una nueva búsqueda:
private SearchView searchView;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.search_menu, menu);
searchView = (SearchView) menu.findItem(R.id.menu_search)
.getActionView(); // set the reference to the searchView
searchView.setOnQueryTextListener(this);
searchMenuItem = (MenuItem) menu.findItem(R.id.menu_search);
searchMenuItem.expandActionView(); // expand the search action item automatically
searchView.setQuery("<put your search term here>", false); // fill in the search term by default
searchView.clearFocus(); // close the keyboard on load
return true;
}
@Override
public boolean onQueryTextSubmit(String query) {
performNewSearch(query);
searchView.clearFocus();
return true;
}