web-dev-qa-db-fra.com

Comment rejeter le clavier dans Android SearchView?

J'ai un searchView dans le ActionBar. Je veux ignorer le clavier lorsque l'utilisateur a terminé la saisie. J'ai le queryTextListener suivant sur le 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; 
    } 
};

Basé sur des questions similaires, le code suivant devrait ignorer le clavier, mais cela ne fonctionne pas dans ce cas:

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

J'ai aussi essayé:

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

Ni l'un ni l'autre ne fonctionne. Je ne sais pas s'il s'agit d'un problème spécifique à Honeycomb ou s'il est lié à searchView dans la barre d'actions ou aux deux. Quelqu'un at-il obtenu ce travail ou savoir pourquoi cela ne fonctionne pas?

51
CACuzcatlan

J'essayais de faire quelque chose de similaire. J'avais besoin de lancer la SearchActivity à partir d'une autre Activity et de faire apparaître le terme de recherche dans le champ de recherche ouvert lors de son chargement. J'ai essayé toutes les approches ci-dessus, mais finalement (similaire à La réponse de Ridcully ci-dessus ) J'ai défini une variable sur SearchView dans onCreateOptionsMenu(), puis dans onQueryTextSubmit() appelé clearFocus() sur la SearchView lorsque l'utilisateur a soumis une nouvelle recherche:

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;
}
64
bkurzius

Simple, droit au but et propre:

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

il suffit de retourner false sur onQueryTextSubmit juste comme ci-dessous

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

D'une certaine manière cela fonctionne si vous appelez

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

et alors 

otherWidget.requestFocus();
10

Pour moi, rien de ce qui précède ne travaillait sur la première soumission. Il se cachait et ensuite immédiatement à nouveau montrer le clavier. Je devais publier la clearFocus() sur le gestionnaire de vues pour que cela se produise une fois que tout était fait.

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

Pour moi, les travaux suivants:

Dans mon activité j'ai une variable membre

private SearchView mSearchView;

Dans onCreateOptionsMenu() j'ai défini cette variable comme suit:

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

Dans la QueryTextListener enfin, je fais ceci:

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

J'ai jeté un coup d'œil au code source de SearchView et, si vous ne réinitialisez pas le texte de la requête en une chaîne vide, SearchView le fait et ne supprime pas non plus le clavier. En fait, l'exploration assez profonde du code source revient à la même chose, suggéra yuku, mais j'aime toujours mieux ma solution, car je n'ai pas à m'occuper de ces choses de bas niveau. 

7
Ridcully

Edit: J'ai ajouté la meilleure solution en haut, mais j'ai aussi gardé l'ancienne réponse comme référence. 

 @Override
        public boolean onQueryTextSubmit(String query) {

                  searchView.clearFocus();
            return false;
        }

Réponse d'origine: J'ai programmé à l'aide d'un setOnQueryTextListener. Lorsque la vue de recherche est masquée, le clavier disparaît, puis lorsqu'il est à nouveau visible, le clavier ne réapparaît pas.

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

     });
2
Parnit

Dans une application pour tablette sur laquelle je travaille avec une activité à double volet, je n'ai écrit que

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

et cela suffisait pour écarter le clavier logiciel après une recherche. Pas besoin d'utiliser InputMethodManager

1
Jose_GD

J'ai utilisé ActionBarSherlock 4.3 et j'ai un ProgressDialog. Lorsque je rejette la méthode postExecute, Searchview gagne le focus. Pour résoudre ce problème:

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

J'espère que ça aide.

1
Roger Garzon Nieto

Tu peux l'utiliser.

if (isKeybordShowing(MainActivity.this, MainActivity.this.getCurrentFocus())) {
    onBackPressed();
}

public boolean isKeybordShowing(Context context, View view) {
    try {
        InputMethodManager keyboard = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
        keyboard.hideSoftInputFromWindow(view.getWindowToken(), 0);
        return keyboard.isActive();
    } catch (Exception ex) {
        Log.e("keyboardHide", "cannot hide keyboard", ex);
        return false;
    }
}
1
Mert TUTSAK

Le code ci-dessous fonctionne pour moi pour masquer le clavier dans 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;
                        }
                    });
0
Ankita Shah

Pourquoi n'essayez-vous pas cela? Lorsque vous appuyez sur le bouton X, vous déclenchez la focalisation sur la vue de recherche, peu importe le choix. 

ImageView closeButton = (ImageView)searchView.findViewById(R.id.search_close_btn);
        closeButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                EditText et = (EditText) findViewById(R.id.search_src_text);
                et.setText("");`enter code here`
                searchView.setQuery("", false);
                searchView.onActionViewCollapsed();
                menuSearch.collapseActionView();
            }
        });

Deux solutions qui ont fonctionné pour moi, la première utilisant l'instance SearchView:

private void hideKeyboard(){
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(searchView.getWindowToken(), 0);
}

Deuxième solution:

private void hideKeyboard(){
            InputMethodManager inputManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
            inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
 }
0
Elenasys