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?
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;
}
Simple, droit au but et propre:
@Override
public boolean onQueryTextSubmit(String query) {
// your search methods
searchView.clearFocus();
return true;
}
il suffit de retourner false sur onQueryTextSubmit juste comme ci-dessous
@Override
public boolean onQueryTextSubmit(String s) {
return false;
}
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();
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;
}
});
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.
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;
}
});
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
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.
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;
}
}
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;
}
});
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);
}