Como eu abro o SearchView programaticamente?

102

Existe este widget para a ActionBar que se chama 'SearchView'. Quando não está em uso, tem a seguinte aparência:

insira a descrição da imagem aqui

E quando está em uso, tem a seguinte aparência:

insira a descrição da imagem aqui

Eu quero (programaticamente, é claro) abrir o searchview (torná-lo "em uso").

Tentei várias funções, como:

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

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

Mas nada disso funcionou ...

O SearchView no 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
fonte

Respostas:

255

Expanda SearchViewcom

searchView.setIconified(false);

e recolhê-lo com

searchView.setIconified(true);

Você precisa alterar o valor de android:showAsActionde ifRoom|collapseActionViewpara always. O SearchViewatributo de android:iconifiedByDefaultdeve ser true, que é o valor padrão, caso contrário, o usuário não pode recolher o SearchViewdepois de ter sido expandido programaticamente.

Matthias Robbers
fonte
15
Olá, um teclado aparece, mas o SearchView não abre.
Eli Revah
1
Olá, isso também não funcionou. Eu atualizei a postagem com o código-fonte XML.
Eli Revah
7
Cara, você é meu herói f * king
Eliseo Ocampos
1
showAsAction = "always" irá exibir uma barra de pesquisa em tela cheia feia, porém, após a rotação
Francesco Gabbrielli
1
showAsAction="always"faz com que o ícone de pesquisa permaneça na barra de ação quando é expandido, o que não se parece com a aparência ao focar a pesquisa manualmente.
Ixx
74

Tente chamar expandActionView()MenuItem, não onActionViewExpanded () em ActionView.

Funciona para mim.

MenuItem searchMenuItem = menu.findItem(R.id.menu_search);
searchView = (SearchView) searchMenuItem.getActionView();
searchMenuItem.expandActionView();
qbait
fonte
10
Funciona perfeitamente, mas apenas para API> 14. Para API anterior, você pode usar isso: MenuItemCompat.expandActionView (searchMenuItem);
Andrei Aulaska
Esta é a solução correta - a selecionada força você a definir, o showAsAction: alwaysque causa alguns problemas.
Ixx
13

Se você quiser usar a biblioteca de suporte apenas quando necessário, faça isso

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

mais simplesmente faça isso

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

Eu sei que esta tarde mas

Tente chamar expandActionView () para abri-lo e collapseActionView () para fechá-lo. Você pode chamar requestFocus () na Action View real via getActionView () para dar o foco da view de pesquisa :)

James Campbell
fonte
1

Expandindo a resposta de Matthias Robberts:

Eu queria um fragmento de lista para manter seu valor de pesquisa e defini-lo depois que o usuário retornar de outro fragmento.

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

e para o menu que mantenho always|collapseActionView, caso contrário, ele permanece aberto quando o usuário exclui o texto.

Gunnar Bernstein
fonte
0

Para abrir uma searchViewguarda close_buttonno final, use isso em onCreate: -

searchView.findViewById(R.id.search_button).performClick();
Santanu Sur
fonte