Come si apre il SearchView a livello di programmazione?


102

C'è questo widget per ActionBar che si chiama "SearchView". Quando non è in uso, assomiglia a questo:

inserisci qui la descrizione dell'immagine

E quando è in uso, assomiglia a questo:

inserisci qui la descrizione dell'immagine

Voglio (naturalmente a livello di programmazione) aprire searchview (renderlo "in uso").

Ho provato diverse funzioni come:

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

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

Ma nessuno di questi ha funzionato ...

Il SearchView nell'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" />

Risposte:


255

Espandi il SearchViewcon

searchView.setIconified(false);

e comprimilo con

searchView.setIconified(true);

È necessario modificare il valore di android:showAsActionda ifRoom|collapseActionViewa always. L' SearchViewattributo di android:iconifiedByDefaultdovrebbe essere true, che è il valore predefinito, altrimenti l'utente non può comprimere il SearchViewdopo che è stato espanso a livello di programmazione.


15
Ciao, si apre una tastiera ma SearchView non si apre.
Eli Revah

1
Ciao, anche questo non ha funzionato. Ho aggiornato il post con il codice sorgente XML.
Eli Revah

7
Amico, sei il mio fottuto eroe
Eliseo Ocampos

1
showAsAction = "always" mostrerà una brutta barra di ricerca a schermo intero però, dopo la rotazione
Francesco Gabbrielli

1
showAsAction="always"fa sì che l'icona di ricerca rimanga sulla barra delle azioni quando è espansa, il che non assomiglia all'aspetto quando si focalizza la ricerca manualmente.
Ixx

74

Prova a chiamare expandActionView()su MenuItem, non suActionViewExpanded () su ActionView.

Per me funziona.

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

10
Funziona perfettamente, ma solo per API> 14. Per API precedenti puoi usare questo: MenuItemCompat.expandActionView (searchMenuItem);
Andrei Aulaska

Questa è la soluzione corretta: quella selezionata ti obbliga a impostare il showAsAction: alwaysche causa alcuni problemi.
Ixx

13

Se desideri utilizzare la libreria di supporto solo quando necessario, fallo

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

altrimenti fallo semplicemente

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

6

So che è tardi ma

Prova a chiamare expandActionView () per aprirlo e collapseActionView () per chiuderlo. Puoi chiamare requestFocus () sull'attuale Action View tramite getActionView () per dare il focus alla vista di ricerca :)


1

Ampliare la risposta di Matthias Robberts:

Volevo un frammento di elenco per mantenere il suo valore di ricerca e impostarlo dopo che l'utente ritorna da un altro frammento.

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

e per il menu tengo always|collapseActionView, altrimenti rimane aperto quando l'utente cancella il testo.


0

Per aprire una searchViewcustodia close_buttonalla fine usa questo in onCreate: -

searchView.findViewById(R.id.search_button).performClick();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.