Як відкрити SearchView програмно?


102

Існує цей віджет для ActionBar, який називається "SearchView". Коли він не використовується, це виглядає приблизно так:

введіть тут опис зображення

А коли він використовується, це виглядає приблизно так:

введіть тут опис зображення

Я хочу (програмно, звичайно) відкрити перегляд пошуку (зробити його "у використанні").

Я спробував кілька функцій, таких як:

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

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

Але ніхто з цих не працював ...

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

Відповіді:


255

Розгорніть SearchViewс

searchView.setIconified(false);

і обвалити його

searchView.setIconified(true);

Вам потрібно змінити значення android:showAsActionз ifRoom|collapseActionViewна на always. Атрибут SearchView's android:iconifiedByDefaultмає бути true, що є значенням за замовчуванням, інакше користувач не може згортати SearchViewпісля того, як він був програмно розширений.


15
Привіт, клавіатура спливаюче, але SearchView не відкривається.
Eli Revah

1
Привіт, це теж не вийшло. Я оновив публікацію вихідним кодом XML.
Eli Revah

7
Людина ти мій герой короля
Елізео Окампос

1
showAsAction = "завжди" відображатиме потворну панель пошуку на повноекранному екрані, хоча після обертання
Франческо Габбріеллі,

1
showAsAction="always"змушує піктограму пошуку залишатися на панелі дій, коли її розгортати, що не нагадує зовнішній вигляд при фокусуванні пошуку вручну.
Ixx

74

Спробуйте зателефонувати expandActionView()в MenuItem, а не onActionViewExpanded () у ActionView.

Це працює для мене.

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

10
Працює ідеально, але лише для API> 14. Для більш раннього API ви можете використовувати це: MenuItemCompat.expandActionView (searchMenuItem);
Андрій Аулашка

Це правильне рішення - вибране змушує вас встановити, showAsAction: alwaysщо викликає деякі проблеми.
Ixx

13

Якщо ви хочете використовувати бібліотеку підтримки лише при необхідності, зробіть це

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

інше просто зробити це

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

6

Я знаю, що це пізно, але

Спробуйте зателефонувати expandActionView (), щоб відкрити його, і колапсActionView (), щоб закрити його. Ви можете зателефонувати requestFocus () на фактичний перегляд дій через getActionView (), щоб надати фокус перегляду в пошуку :)


1

Розширення відповіді Маттіаса Робертса:

Я хотів, щоб фрагмент списку зберігав його значення пошуку та встановлював його після повернення користувача з іншого фрагмента.

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

а для меню, яке я зберігаю always|collapseActionView, інакше воно залишається відкритим, коли користувач видаляє текст.


0

Щоб відкрити searchViewзбереження close_buttonв кінцевому підсумку, скористайтеся цим onCreate:

searchView.findViewById(R.id.search_button).performClick();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.