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" />

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.


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();

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);

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 :)


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.


0

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

searchView.findViewById(R.id.search_button).performClick();
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.