web-dev-qa-db-fra.com

Comment fermer un SearchView par programme?

J'ai actuellement une SearchView dans la barre d'action de mon application. Lorsque je clique sur l'icône de recherche, la variable SearchView se développe et le clavier s'affiche comme prévu. Un clic sur le "X" dans la case SearchView ferme la SearchView comme prévu. Cependant, lorsque la SearchView est activée et que j'appuie sur le bouton "Précédent", mon application est fermée. C’est le comportement correct, mais ce que j’essaie de faire maintenant, c’est de capturer le bouton précédent et de le laisser fermer la SearchView (pas mon application) lorsque la SearchView est visible. Existe-t-il un moyen d'appeler la SearchViewOnCloseListener() par programmation lors d'une pression sur le bouton retour Par exemple, quelque chose comme ceci:

// On a back button press, if we are currently searching,
// close the SearchView. Otherwise, invoke normal back button
// behavior.
public boolean onKeyDown(int keyCode, KeyEvent event) {
   if (keyCode == KeyEvent.KEYCODE_BACK) {
        if (isSearchViewVisible) {
            SearchView searchView = (SearchView) menu.findItem(R.id.searchBox)
               .getActionView();

            // This method does not exist
            searchView.invokeClose();
            return true;
        }
    }
    return super.onKeyDown(keyCode, event);
}
55
Tim

Basé sur la réponse de @MarcinOrlowski, vous pouvez aussi utiliser:

@Override
public void onBackPressed() {
    if (!searchView.isIconified()) {
        searchView.setIconified(true);
    } else {
        super.onBackPressed();
    }
}
126
Mohsen Afshin

Utilisation

searchView.setIconified(true)

J'ai aussi utilisé MenuItemCompat.collapseActionView

MenuItemCompat.collapseActionView(menuItem)
45
betorcs

Il existe un moyen simple de le faire:

@Override
public void onBackPressed() {
    if (!searchView.isIconified()) {
        searchView.onActionViewCollapsed();
    } else {
        super.onBackPressed();
    }
}

ou utiliser:

@Override
public void onBackPressed() {
    searchView.onActionViewCollapsed();
    super.onBackPressed();
}

Cela entraînera la réduction de searchView avant que vous appuyiez sur la touche back puis l'action back sera appelée.

Les deux solutions fonctionneront.

31
blueware

c'est la seule chose qui le fait pour moi:

  toolbar.collapseActionView();
26
raklos

Pour intercepter le bouton RETOUR, remplacez onBackPressed() ( voir docs )

@Override
public void onBackPressed() {

    if (isSearchViewVisible) {
        SearchView searchView = (SearchView) menu.findItem(R.id.searchBox)
           .getActionView();

        // This method does not exist
        searchView.invokeClose();
    } else {
        super.onBackPressed();
    }
}

MODIFIER:

Les docs disent :

Si nécessaire, vous pouvez développer ou réduire la vue Action dans votre propre code en appelant expandActionView () et collapseActionView () sur le Élément du menu.

22
Marcin Orlowski

si vous avez saisi votre searchView

mSearchView.setIconified(true);

effacera seulement le texte.

La méthode correcte pour fermer searchView est

mSearchView.onActionViewCollapsed();
12
DoruChidean

Utilisation:

searchView.setIconified(true);
2
Alex

Je préfère !searchView.isIconified() à if(isSearchViewVisible) dans la méthode onBackPressed() car l'option 2 ne fonctionne pas lorsque des fragments sont ajoutés dans votre fragmentmanager'sbackstack que vous souhaitez afficher lorsque vous appuyez sur le bouton Précédent.

2
Codedroid

Pas besoin d'utiliser la méthode onBackPressed() pour cela !! J'ai trouvé la solution, ne faites que ce que j'ai mentionné ci-dessous pour que SearchView gère lui-même l'appui sur le bouton de retour event.

Dans votre méthode onCreateOptionsMenu()

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    MenuItem menuItem = menu.findItem(R.id.action_search);
    SearchView searchview = (SearchView) menuItem.getActionView();
    searchview.setIconifiedByDefault(true);
    searchview.setQueryHint("Enter your keyword");
    searchview.setOnQueryTextListener(this); 
    super.onCreateOptionsMenu(menu, inflater);
}

Dans votre attribut menu.xml add showAsAction et définissez ses valeurs sur "always|collapseActionView"

<item
    Android:id="@+id/action_search_item"
    Android:title="Search"
    Android:icon="@drawable/ic_search_logo"
    app:showAsAction="always|collapseActionView"
    app:actionViewClass="Android.support.v7.widget.SearchView"/>

Et vous êtes prêt à partir;)

P.S. - Je cherchais une solution depuis longtemps et j'en ai trouvé une, j'espère que cela vous aidera tous.

0
codervishal

Aussi, vous pouvez utiliser collapseActionView. Il gère automatiquement le bouton de retour, en réduisant SearchView

<item
      Android:id="@+id/action_search"
      Android:icon="@drawable/ic_magnify"
      Android:title="@string/action_title_search"
      app:actionViewClass="Android.support.v7.widget.SearchView"
      app:showAsAction="ifRoom|collapseActionView" />
0
Deni Erdyneev

Si vous n'utilisez aucune fonction dans la méthode onBackPressed(), supprimez-la de votre Activity.So que la SearchView gère elle-même l'événement onBackPress.

J'utilise SearchView en tant que

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    MenuItem searchItem = menu.findItem(R.id.action_search);
    SearchView searchview = (SearchView) MenuItemCompat.getActionView(searchItem);
    searchview.setIconifiedByDefault(true);
    searchview.setOnQueryTextListener(this);
    searchview.setSubmitButtonEnabled(true);  
    searchview.setQueryHint("Search Here"); 
    super.onCreateOptionsMenu(menu, inflater);
}

et mon menu.xml comme suit

<item
    Android:id="@+id/action_search"
    Android:icon="@drawable/search_tool"
    Android:orderInCategory="1"
    Android:title="Search" 
    app:actionViewClass="Android.support.v7.widget.SearchView"
    app:showAsAction="always|collapseActionView"/>
0
SachinS

Ma façon:

  1. Créer une classe CustomSearchView

 La classe publique CustomSearchView étend SearchView {
 public CustomSearchView (contexte de contexte final) {
 super (contexte); 
 this.setIconifiedByDefault (true); 
 } 

 @Passer outre
 public boolean dispatchKeyEventPreIme (événement KeyEvent) {
 if (event.getKeyCode () == KeyEvent.KEYCODE_BACK && 
 event.getAction () == KeyEvent.ACTION_UP) {
 this.onActionViewCollapsed (); 
 } 
 renvoyer super.dispatchKeyEventPreIme (event); 
 } 
 } 

  1. Ajouter actionViewClass
 <item 
 Android: id = "@ + id/menu_search" 
 Android: title = "@ string/menu_search" 
 Android: icon = "@ drawable/ic_search" 
 Android: showAsAction = "collapseActionView | ifRoom" 
 Android: actionViewClass = "com.myapp.CustomSearchView" />
  1. Créez CustomSearchView dans le onCreateOptionsMenu 
 CustomSearchView searchView = (CustomSearchView) menu.findItem (R.id.menu_search) .getActionView (); 
0
Sergei K