Как программно открыть 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.
Эли Рева
7
Человек, ты мой
Элисео Окампос
1
showAsAction = "always" будет отображать уродливую полноэкранную панель поиска после поворота
Франческо Габбриелли
1
showAsAction="always"заставляет значок поиска оставаться на панели действий при раскрытии, что не похоже на внешний вид при ручной фокусировке поиска.
Ixx
75

Попробуйте вызвать expandActionView()MenuItem, а не onActionViewExpanded () для ActionView.

Меня устраивает.

MenuItem searchMenuItem = menu.findItem(R.id.menu_search);
searchView = (SearchView) searchMenuItem.getActionView();
searchMenuItem.expandActionView();
qbait
источник
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 (), чтобы открыть его, и collapseActionView (), чтобы закрыть. Вы можете вызвать 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();
Сантану Сур
источник