¿Cómo abro SearchView mediante programación?

102

Existe este widget para ActionBar que se llama 'SearchView'. Cuando no está en uso, se ve así:

ingrese la descripción de la imagen aquí

Y cuando está en uso, se ve así:

ingrese la descripción de la imagen aquí

Quiero (programáticamente por supuesto) abrir la vista de búsqueda (hacerla "en uso").

Probé varias funciones como:

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

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

Pero ninguno de esos funcionó ...

SearchView en el 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
fuente

Respuestas:

255

Expandir el SearchViewcon

searchView.setIconified(false);

y colapsarlo con

searchView.setIconified(true);

Es necesario cambiar el valor de android:showAsActionpartir ifRoom|collapseActionViewa always. El SearchViewatributo ' android:iconifiedByDefaultdebe ser true, que es el valor predeterminado; de lo contrario, el usuario no puede contraer el SearchViewdespués de que se expandió mediante programación.

Matthias ladrones
fuente
15
Hola, aparece un teclado, pero SearchView no se abre.
Eli Revah
1
Hola, esto tampoco funcionó. Actualicé la publicación con el código fuente XML.
Eli Revah
7
Hombre, eres mi maldito héroe
Eliseo Ocampos
1
showAsAction = "always" mostrará una fea barra de búsqueda a pantalla completa, después de la rotación
Francesco Gabbrielli
1
showAsAction="always"hace que el icono de búsqueda permanezca en la barra de acciones cuando se expande, lo que no se parece a la apariencia cuando se enfoca la búsqueda manualmente.
Ixx
75

Intente llamar expandActionView()a MenuItem, no a onActionViewExpanded () en ActionView.

Esto funciona para mi.

MenuItem searchMenuItem = menu.findItem(R.id.menu_search);
searchView = (SearchView) searchMenuItem.getActionView();
searchMenuItem.expandActionView();
qbait
fuente
10
Funciona perfectamente, pero solo para API> 14. Para API anteriores, puede usar esto: MenuItemCompat.expandActionView (searchMenuItem);
Andrei Aulaska
Esta es la solución correcta: la seleccionada lo obliga a establecer lo showAsAction: alwaysque causa algunos problemas.
Ixx
13

Si desea utilizar la biblioteca de soporte solo cuando sea necesario, haga esto

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

si no, simplemente haz esto

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

Se que esto es tarde pero

Intente llamar a expandActionView () para abrirlo y collapseActionView () para cerrarlo. Puede llamar a requestFocus () en la Vista de acción real a través de getActionView () para dar el enfoque de la vista de búsqueda :)

James Campbell
fuente
1

Ampliando la respuesta de Matthias Robberts:

Quería un fragmento de lista para mantener su valor de búsqueda y configurarlo después de que el usuario regrese de otro fragmento.

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

y para el menú que guardo always|collapseActionView, de lo contrario, permanece abierto cuando el usuario elimina el texto.

Gunnar Bernstein
fuente
0

Para abrir un searchViewmantenimiento close_buttonal final, use esto en onCreate: -

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