Réduire automatiquement ActionBar SearchView sur le clavier logiciel fermer

J’utilise actuellement un élément de menu ActionBar pour afficher un SearchView dans la barre d’action. Lorsque l’élément de menu de recherche est développé, le clavier logiciel s’affiche, ce que je veux. Maintenant, lorsque l’utilisateur appuie sur le bouton de retour pour fermer le clavier logiciel, je souhaite également réduire le SearchView dans la barre d’action.

J’ai essayé d’implémenter les écouteurs suivants OnKeyListener et OnFocusChangeListener sur MenuItem et ActionView. J’ai également essayé d’utiliser OnBackPressed () dans l’activité. Aucun des éléments ci-dessus ne permet de savoir si le bouton Retour est utilisé pour fermer le clavier logiciel.

Des idées?

J’ai implémenté OnActionExpandListener pour savoir quand SearchView est visible.

Je vais développer la réponse de @ user1258568 pour les fainéants. Cela a fonctionné pour moi. Notez qu’il efface votre requête lorsque le focus est perdu.

final MenuItem searchMenuItem = optionsMenu.findItem(R.id.search); final SearchView searchView = (SearchView) searchMenuItem.getActionView(); searchView.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View view, boolean queryTextFocused) { if(!queryTextFocused) { searchMenuItem.collapseActionView(); searchView.setQuery("", false); } } }); 

J’ai trouvé une meilleure solution.

 searchView.setOnQueryTextFocusChangeListener(). 

OnQueryTextFocusChangeListener est appelé lorsque le clavier est affiché ou masqué. Est appelé en premier lorsque le clavier est affiché et que la vue de recherche a le focus. Obtient à nouveau l’appel lorsque le keyboard est masqué et que la vue de recherche perd le focus, peut close search view puis utiliser

 menuItem.collapseActionView(). 

Just Override onBackPressed comme ceci:

 @Override public void onBackPressed() { if (searchView.isShown()){ searchView.onActionViewCollapsed(); //collapse your ActionView searchView.setQuery("",false); //clears your query without submit isClosed = true; //needed to handle closed by back } else{ super.onBackPressed(); } } 

et votre onCreateOptionsMenu gonflerait le mSearchView comme ceci:

 @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); getMenuInflater().inflate(R.menu.menu_search, menu); mSearchView = (SearchView) menu.findItem(R.id.menu_action_search).getActionView(); mSearchView.setOnQueryTextListener(this); mSearchView.setOnSearchClickListener(this); mSearchView.setOnCloseListener(this); isClosed = true; return true; } 

Avez-vous la classe implémenter ce qui suit comme ceci:

 public class myActivity extends FragmentActivity implements SearchView.OnQueryTextListener, View.OnClickListener, SearchView.OnCloseListener { 

dont vous aurez également besoin:

 @Override public void onClick(View view) { isClosed = false; } @Override public boolean onClose() { isClosed = true; return false; } 

Vous devrez faire “mSearchView” et “isClosed” les deux variables globales à l’activité.

La réponse de Jon Willis fonctionne très bien. Ceci est une amélioration de sa réponse.

Tout d’abord, créez une nouvelle classe qui implémente View.OnFocusChangeListener :

 public class SearchViewFocusListener implements View.OnFocusChangeListener { private final MenuItem mMenuItem; public SearchViewFocusListener(MenuItem menuItem) { mMenuItem = menuItem; } @Override public void onFocusChange(View v, boolean hasFocus) { if (!hasFocus) { mMenuItem.collapseActionView(); if (v instanceof SearchView) { ((SearchView) v).setQuery("", false); } } } } 

Ensuite, définissez l’écouteur sur votre SearchView :

 searchView.setOnQueryTextFocusChangeListener(new SearchViewFocusListener(menuItem)); 

Il suffit de mettre l’atsortingbut “collapseActionView” dans la disposition du menu

   < --this one  

Cela vous donnera les fonctionnalités que vous recherchez tout seul. N’oubliez pas d’appeler la méthode “clearFocus” sur SearchView pour fermer le clavier une fois que vous envoyez la requête.

C’est ce que j’ai fait pour faire disparaître le clavier. Vous pouvez essayer de voir si cela fonctionne pour vous. Je searchView la searchView à l’invisible puis à nouveau visible.

  //set query change listener searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener(){ @Override public boolean onQueryTextChange(Ssortingng newText) { // TODO Auto-generated method stub return false; } @Override public boolean onQueryTextSubmit(Ssortingng 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; } }); 

C’est réalisable comme ceci:

  private void setupSearchView(Menu menu) { final MenuItem searchMenuItem = menu.findItem(R.id.action_search); final SearchView searchView = (SearchView) searchMenuItem.getActionView(); [...] searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(Ssortingng query) { searchMenuItem.collapseActionView(); return false; } @Override public boolean onQueryTextChange(Ssortingng newText) { return true; } }); } 

Les solutions basées sur setOnQueryTextFocusChangeListener () n’ont pas fonctionné car l’événement n’a pas été lancé – searchView n’a pas perdu le focus lors de l’envoi, probablement parce que j’effectue la recherche dans la même activité qui contient la vue de recherche.

Quoi qu’il en soit, je pense que l’utilisation d’OnQueryTextListener est plus correcte, car elle décrit l’événement de soumission plus précise du texte.

 @Override public boolean onCreateOptionsMenu(Menu menu) { getSupportMenuInflater().inflate(R.menu.home_screen, menu); SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); final MenuItem searchMenuItem = menu.findItem(R.id.menu_search); final SearchView searchView = (SearchView) searchMenuItem .getActionView(); searchView.setIconifiedByDefault(false); if (searchManager != null && searchView != null) { searchView.setSearchableInfo(searchManager .getSearchableInfo(getComponentName())); searchView .setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (!hasFocus) { if (searchMenuItem != null) { searchMenuItem.collapseActionView(); }// end if if (searchView != null) { searchView.setQuery("", false); }// end if }// end if } }); searchView .setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(Ssortingng query) { /** * hides and then unhides search tab to make sure * keyboard disappears when query is submitted */ if (searchView != null) { searchView.setVisibility(View.INVISIBLE); searchView.setVisibility(View.VISIBLE); } return false; } @Override public boolean onQueryTextChange(Ssortingng newText) { // TODO Auto-generated method stub return false; } }); } return super.onCreateOptionsMenu(menu); } 

Si vous souhaitez réduire le clavier lorsque l’utilisateur clique sur l’icône de recherche sur le clavier, cela peut être réalisé par simple

inside onquerytextsubmitted {

searchView.clearfocus()

}

Vous devez appeler setIconified deux fois.

Pour réduire la vue de recherche et fermer le clavier.
Avec le premier appel, le texte de la vue de recherche est effacé avec le clavier du deuxième appel et la vue de recherche est fermée.

Pour certaines raisons, menuItem.collapseActionView() n’a pas fonctionné, j’ai donc utilisé searchView.setIconified(true) place.

Cela donne le résultat ci-dessous comme exemple de code.

 final MenuItem searchItem = (MenuItem) menu.findItem(R.id.menu_item_search); final SearchView searchView = (SearchView) searchItem.getActionView(); searchView.setOnQueryTextFocusChangeListener(new SearchView.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (!hasFocus) { searchView.setIconified(true); } } });