android android-actionbar android-3.0-honeycomb searchview

¿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; }