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" />
Eli Revah
la source

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.

Matthias Voleurs
la source
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();
qbait
la source
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);
Olayinka
la source
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 :)

James Campbell
la source
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.

Gunnar Bernstein
la source
0

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

searchView.findViewById(R.id.search_button).performClick();
Santanu Sur
la source