47

Tengo un searchView en la barra de acciones. Quiero descartar el teclado cuando el usuario haya terminado con la entrada. He queryTextListener el siguiente en la SearchVIEW¿Cómo descartar el teclado en Android 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; 
    } 
}; 

Sobre la base de preguntas similares, el siguiente código debe ocultar el teclado, pero no funciona en este caso:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 

También he intentado :

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?

Respuesta

9

De alguna manera funciona si se llama

InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
imm.hideSoftInputFromWindow(searchView.getWindowToken(), 0); 

y luego

otherWidget.requestFocus(); 
7

Para mí, las siguientes obras:

En mi actividad que tengo una variable miembro

private SearchView mSearchView; 

En onCreateOptionsMenu() me ponga esa variable de este modo:

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 al fin, hago esto:

mSearchView.setQuery("", false); 
mSearchView.setIconified(true); 

tuve un vistazo al código fuente de SearchView, y si no se restablece el Consultar texto a una cadena vacía, SearchView solo hace eso, y no elimina el teclado tampoco. 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.

1

En una aplicación de la tableta que estoy trabajando con una actividad de doble panel, yo he escrito solamente

f.getView().requestFocus(); // f is the target fragment for the search

y eso fue suficiente para cerrar el teclado en pantalla después de una búsqueda. No es necesario utilizar InputMethodManager

59

Estaba intentando hacer algo similar. Necesitaba iniciar el SearchActivity desde otro Activity y hacer que el término de búsqueda apareciera en el campo de búsqueda abierto cuando se cargaba. Probé todos los enfoques anteriores, pero finalmente (similar a Ridcully's answer above) configurar una variable a SearchView en onCreateOptionsMenu() y luego en onQueryTextSubmit() llamado clearFocus() en el 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; 
} 
+0

donde se '' query'' define en '' onCreateOptionsMenu''? –

+0

..que es la cadena de consulta que se define en otro lugar. lo editaré. Esa línea tampoco es necesaria, solo si desea completar previamente la consulta y el segundo argumento (falso) impide que ejecute la consulta. – bkurzius

+1

¡Muchas gracias! searchView.clearFocus() es la parte que falta hasta ahora – satyadeepk

1

Solía ​​ActionBarSherlock 4.3 y Tengo un ProgressDialog. Cuando lo descarto en el método postExecute, Searchview gana foco. Para solucionarlo:

//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 que ayude.

1

Editar: He añadido la mejor solución en la parte superior, pero también he mantenido la respuesta anterior como referencia.

@Override 
     public boolean onQueryTextSubmit(String query) { 

        searchView.clearFocus(); 
      return false; 
     } 

Respuesta original: Programé usando un 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; 
     } 

    }); 
+0

¿Por qué estás usando números mágicos, en lugar de las constantes? Además, esta es solo una respuesta hacky. –

24

simple, directo al grano y limpia:

@Override 
    public boolean onQueryTextSubmit(String query) { 
     // your search methods 
     searchView.clearFocus(); 
     return true; 
    } 
+2

Esta debería ser la respuesta aceptada – AlexF11

+3

Esto no se llama si el 'SearchView' está vacío ... – Sakiboy

11

acaba de regresar falsa en onQueryTextSubmit al igual que por debajo de

@Override 
public boolean onQueryTextSubmit(String s) { 
    return false; 
} 
0

Dos soluciones que trabajaron para mí, el primero mediante el 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); 
} 
6

Para mí, nada de lo anterior estaba trabajando en la primera presenten. Estaba escondido y luego volvió a mostrar el teclado de inmediato. Tuve que publicar el clearFocus() en el controlador de la vista para que suceda después de que se hizo 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; 
      } 
     }); 
0

A continuación código está trabajando para que me esconda en el teclado 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; 
         } 
        }); 
Cuestiones relacionadas