Comment ouvrir SearchView par programme?


102

Il y a ce widget pour l'ActionBar qui s'appelle «SearchView». Lorsqu'il n'est pas utilisé, cela ressemble à ceci:

entrez la description de l'image ici

Et quand il est utilisé, cela ressemble à ceci:

entrez la description de l'image ici

Je veux (par programme bien sûr) ouvrir la vue de recherche (la rendre "en cours d'utilisation").

J'ai essayé plusieurs fonctions telles que:

SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
    searchView.setOnQueryTextListener(this);

    searchView.performClick();
    searchView.requestFocus();

Mais aucun de ceux-ci n'a fonctionné ...

Le SearchView dans le XML:

<item android:id="@+id/menu_search"
      android:title="Search"
      android:icon="@drawable/ic_action_search"
      android:showAsAction="ifRoom|collapseActionView"
      android:actionViewClass="android.widget.SearchView" />

Réponses:


255

Développez le SearchViewavec

searchView.setIconified(false);

et réduisez-le avec

searchView.setIconified(true);

Vous devez changer la valeur de android:showAsActionpartir ifRoom|collapseActionViewà always. L' SearchViewattribut s android:iconifiedByDefaultdoit être true, qui est la valeur par défaut, sinon l'utilisateur ne peut pas réduire le SearchViewaprès qu'il a été développé par programme.


15
Bonjour, un clavier apparaît mais le SearchView ne s'ouvre pas.
Eli Revah

1
Bonjour, cela n'a pas fonctionné non plus. J'ai mis à jour le message avec le code source XML.
Eli Revah

7
Man you are my f * king hero
Eliseo Ocampos

1
showAsAction = "always" affichera cependant une vilaine barre de recherche plein écran, après la rotation
Francesco Gabbrielli

1
showAsAction="always"fait que l'icône de recherche reste sur la barre d'action lorsqu'elle est développée, ce qui ne ressemble pas à l'apparence lorsque vous concentrez la recherche manuellement.
Ixx

75

Essayez d'appeler expandActionView()MenuItem, pas onActionViewExpanded () sur ActionView.

Ça marche pour moi.

MenuItem searchMenuItem = menu.findItem(R.id.menu_search);
searchView = (SearchView) searchMenuItem.getActionView();
searchMenuItem.expandActionView();

10
Fonctionne parfaitement, mais uniquement pour les API> 14. Pour les API antérieures, vous pouvez utiliser ceci: MenuItemCompat.expandActionView (searchMenuItem);
Andrei Aulaska

C'est la bonne solution - La solution sélectionnée vous oblige à définir showAsAction: alwaysce qui pose certains problèmes.
Ixx

13

Si vous souhaitez utiliser la bibliothèque de support uniquement lorsque cela est nécessaire, procédez comme suit

    MenuItem searchMenuItem = menu.findItem(R.id.action_search);
    if (Utils.hasIceCreamSandwich())
        searchMenuItem.expandActionView();
    else MenuItemCompat.expandActionView(searchMenuItem);

sinon faites simplement ceci

    MenuItem searchMenuItem = menu.findItem(R.id.action_search);
    MenuItemCompat.expandActionView(searchMenuItem);

6

Je sais que c'est tard mais

Essayez d'appeler expandActionView () pour l'ouvrir et collapseActionView () pour le fermer. Vous pouvez appeler requestFocus () sur la vue Action réelle via getActionView () pour donner le focus à la vue de recherche :)


1

Élargir la réponse de Matthias Robberts:

Je voulais qu'un fragment de liste conserve sa valeur de recherche et le définisse après le retour de l'utilisateur d'un autre fragment.

if (myViewModel.filterTextSaved.isNotEmpty()) { // Kotlin, storing state in ViewModel
    searchItem.expandActionView() // needs to come first, otherwise empty text
    theTextArea.setText(courseViewModel.filterTextOnClick)
}

et pour le menu que je garde always|collapseActionView, sinon il reste ouvert lorsque l'utilisateur supprime le texte.


0

Pour ouvrir un searchViewgarder le close_buttonà la fin, utilisez ceci dans onCreate: -

searchView.findViewById(R.id.search_button).performClick();
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.