Jak programowo otworzyć SearchView?

102

Istnieje widget dla ActionBar, który nazywa się „SearchView”. Kiedy nie jest używany, wygląda następująco:

wprowadź opis obrazu tutaj

A kiedy jest używany, wygląda tak:

wprowadź opis obrazu tutaj

Chcę (oczywiście programowo) otworzyć widok wyszukiwania (uczynić go „używanym”).

Wypróbowałem kilka funkcji, takich jak:

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

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

Ale żaden z nich nie zadziałał ...

SearchView w 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
źródło

Odpowiedzi:

255

Rozwiń za SearchViewpomocą

searchView.setIconified(false);

i zwiń go za pomocą

searchView.setIconified(true);

Musisz zmienić wartość android:showAsActionod ifRoom|collapseActionViewna always. W SearchView„s atrybut android:iconifiedByDefaultpowinien być true, co jest wartością domyślną, w przeciwnym wypadku użytkownik nie może zwinąć SearchViewpo tym jak został rozszerzony programowo.

Matthias Robbers
źródło
15
Witaj, pojawia się klawiatura, ale widok wyszukiwania nie otwiera się.
Eli Revah,
1
Witam, to też nie zadziałało. Zaktualizowałem post z kodem źródłowym XML.
Eli Revah,
7
Człowieku, jesteś moim
pieprzonym
1
showAsAction = "always" spowoduje jednak wyświetlenie brzydkiego pełnoekranowego paska wyszukiwania po obróceniu
Francesco Gabbrielli,
1
showAsAction="always"sprawia, że ​​ikona wyszukiwania pozostaje na pasku akcji, gdy jest rozwinięta, co nie przypomina wyglądu przy ręcznym ustawianiu wyszukiwania.
Ixx
75

Spróbuj wywołać expandActionView()MenuItem, a nie onActionViewExpanded () w ActionView.

Mi to pasuje.

MenuItem searchMenuItem = menu.findItem(R.id.menu_search);
searchView = (SearchView) searchMenuItem.getActionView();
searchMenuItem.expandActionView();
qbait
źródło
10
Działa idealnie, ale tylko dla API> 14. W przypadku wcześniejszych API możesz użyć tego: MenuItemCompat.expandActionView (searchMenuItem);
Andrei Aulaska
To jest poprawne rozwiązanie - wybrane zmusza do ustawienia, showAsAction: alwaysktóre powoduje pewne problemy.
Ixx
13

Jeśli chcesz korzystać z biblioteki wsparcia tylko wtedy, gdy jest to konieczne, zrób to

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

inaczej po prostu to zrób

    MenuItem searchMenuItem = menu.findItem(R.id.action_search);
    MenuItemCompat.expandActionView(searchMenuItem);
Olayinka
źródło
6

Wiem, że to późno, ale

Spróbuj wywołać metodę expandActionView (), aby ją otworzyć, i collapseActionView (), aby ją zamknąć. Możesz wywołać requestFocus () w rzeczywistym widoku akcji za pomocą metody getActionView (), aby nadać fokus widokowi wyszukiwania :)

James Campbell
źródło
1

Rozszerzając odpowiedź Matthiasa Robbertsa:

Chciałem, aby fragment listy zachował swoją wartość wyszukiwania i ustawił ją po powrocie użytkownika z innego fragmentu.

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

a dla menu, które trzymam always|collapseActionView, w przeciwnym razie pozostaje otwarte, gdy użytkownik usunie tekst.

Gunnar Bernstein
źródło
0

Aby otworzyć searchViewutrzymanie close_buttonw końcu, użyj tego w onCreate: -

searchView.findViewById(R.id.search_button).performClick();
Santanu Sur
źródło