Expandir y dar foco a SearchView automáticamente

Estoy desarrollando una aplicación donde el usuario presiona el ícono "Buscar" en el ActionBar y SearchView se hace visible en la parte superior de la pantalla.

Mi problema es que el SearchView no está enfocado ni expandido, por lo que el usuario debe presionar el botón de búsqueda en el Searchview para que se expanda y muestre el teclado.

¿Cómo debería solucionarse esto?

preguntado el 29 de julio de 12 a las 15:07

18 Respuestas

Para hacer que SearchView se expanda de forma predeterminada, llame setIconifiedByDefault(falso) en él cuando lo inicializa (por ejemplo, en onCreateOptionsMenu(..) or onPrepareOptionsMenu(..)). En la mayoría de los casos, he encontrado que esto le dará el foco automáticamente, pero si no, simplemente llame requestFocus() en él también.

contestado el 04 de mayo de 20 a las 07:05

No estoy seguro para ser honesto, lo siento. - Alex Curran

Añadiendo un requestFocus() llamar onPrepareOptionsMenu(..) hizo el truco para mí. - El sucio calvinista

requestFocus no funciona para mi Para "enfocar" puedes llamar setIconified false - Pedro Chaula

@SweSnow Debe configurar ambos ... searchView.setIconifiedByDefault (falso); searchView.requestFocus(); - pallav bohara

asegúrese de haber establecido la propiedad del elemento del menú app:showAsAction="always". Cuando eliminé el enfoque automático, el ícono desapareció y apareció el ícono de 3 puntos: Riccardo

si quieres tenerlo iconifiedByDefault, esto funcionó para mí. setFocusable e setIconified Se necesitan.

    SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
    searchView.setIconifiedByDefault(true);
    searchView.setFocusable(true);
    searchView.setIconified(false);
    searchView.requestFocusFromTouch();

Actualización: si está utilizando android.support.v7.widget.SearchView el comportamiento nosotros muy diferente. clearFocus es necesario si no desea que el teclado aparezca todo el tiempo. Por alguna razón, el menú se recrea todo el tiempo cuando se usa appcompat.

SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
searchView.setIconified(false);
searchView.clearFocus();

respondido 16 mar '17, 11:03

También puede llamar al método expandActionView() para forzarlo:

@Override
public boolean onCreateOptionsMenu( Menu menu )
{
    super.onCreateOptionsMenu( menu );

    MenuItem searchMenuItem = menu.findItem( R.id.mi_search ); // get my MenuItem with placeholder submenu
    searchMenuItem.expandActionView(); // Expand the search menu item in order to show by default the query

    return true;
}

Elemento de búsqueda en el diseño de la barra de acción:

<item
        android:id="@+id/mi_search"
        android:icon="@drawable/abs__ic_search_api_holo_light"
        android:title="@string/search"
        android:showAsAction="ifRoom|collapseActionView"
        android:actionViewClass="com.actionbarsherlock.widget.SearchView"
        />

respondido 30 mar '13, 17:03

Si utiliza Compatibilidad de aplicaciones, en lugar de llamar expandActionView() directamente en el searchMenuItem, deberías usar esto en su lugar: MenuItemCompat.expandActionView(searchMenuItem). - Carlos Madere

@CharlesMadere way es el único que funcionó para mí, API 23 - Mateo

más 1 por searchMenuItem.expandActionView(); - Vlad

MenuItemCompat.expandActionView(searchMenuItem) está en desuso ahora - afortunado

Esta solución está en desuso. - Favorecer a Felix Chinemerem

Si lo está utilizando en el diseño, puede llamar

mSearchView.onActionViewExpanded()

Respondido el 02 de diciembre de 13 a las 18:12

¿Qué significa usar en el diseño? - pascalius

Quiero decir que te refieres a él como un Viewno, MenuItem - riwnodennyk

eso no funcionó para mí. Sin embargo, llamar a setIconified() sí lo hizo. - señorarado

también funcionó para mí, no estoy seguro de por qué en el sitio web oficial no se han incluido en el código de muestra. Quiero decir, si estoy haciendo clic en el botón de búsqueda, ¿el teclado debería abrirse, verdad? - Tushar Srivastava

Kotlin

var searchView = menu.findItem(R.id.action_search).actionView as SearchView
searchView.isIconified = true

contestado el 26 de mayo de 21 a las 08:05

La respuesta de @ Pascalius funcionó para mí. Pero cada vez que cierra SearchView y vuelve a hacer clic, pierde el foco. Así que inserté el código en un setOnMenuItemClickListener Me gusta esto:

MenuItem item = menu.findItem(R.id.action_search);

SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
final SearchView searchView = (SearchView) item.getActionView();

item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
    @Override
    public boolean onMenuItemClick(MenuItem menuItem) {
        searchView.setIconifiedByDefault(true);
        searchView.setFocusable(true);
        searchView.setIconified(false);
        searchView.requestFocusFromTouch();

        return false;
    }
});

Respondido el 10 de Septiembre de 17 a las 06:09

Llame a expandActionView() en el elemento del menú.

menuItem.expandActionView()

contestado el 21 de mayo de 20 a las 03:05

Me estaba costando mucho hacer esto con SearchView widget, Pero el expandActionView() method en realidad está definido en la clase MenuItem, no en la clase SearchView. Entonces, lo resolví por

        MenuItem searchItem = menu.findItem(R.id.item_search);
        SearchView   searchView = (SearchView) searchItem.getActionView();
        searchItem.expandActionView();//the method expandActionView is called on searchItem not searchView

Respondido 06 Feb 21, 09:02

Si está usando dentro de una actividad, necesita usar

view.onActionViewExpanded();

si está usando opciones de menú internas, debe usar

MenuItem.expandActionView();

Nota: solo funciona para SearchView

estas dos situaciones me funcionan.

contestado el 18 de mayo de 16 a las 12:05

Para Appcompat Searchview puede utilizar este método:

MenuItemCompat.expandActionView(mSearchMenuItem);

Respondido el 19 de Septiembre de 17 a las 14:09

Esto funcionó para mí:

En el diseño raíz:

xmlns:app="http://schemas.android.com/apk/res-auto"

SearchView definido de la siguiente manera:

 <android.support.v7.widget.SearchView
        android:id="@+id/search_contacts"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_margin="15dp"
        android:background="@drawable/search_view"        
        app:iconifiedByDefault="false"
        app:queryHint="Search name or email"
        >

        <requestFocus />
    </android.support.v7.widget.SearchView>

La diferencia está en la etiqueta de la aplicación.

app:iconifiedByDefault="false"
app:queryHint="Search name or email"

Respondido 08 Feb 15, 08:02

utilizar este

SearchManager searchManager = (SearchManager) mActivity.getSystemService(Context.SEARCH_SERVICE);
                SearchView searchView = new SearchView(mActivity.actionBar.getThemedContext());
                searchView.setSearchableInfo(searchManager.getSearchableInfo(mActivity.getComponentName()));
                searchView.setIconifiedByDefault(false);
                searchView.setQueryHint("Search");
                menu.findItem(R.id.action_search).setActionView(searchView);

Respondido 12 Jul 17, 13:07

android:iconifiedByDefault="true"

Arriba está el código en XML que me ayudó a expandirlo y enfocarlo automáticamente en la vista de búsqueda al hacer clic:

respondido 10 mar '20, 06:03

Esto funcionó para mí:

menu.expandActionView();

Respondido 08 ago 13, 14:08

pero el ícono de cerrar no es visible inicialmente en forma expandida. stackoverflow.com/questions/27706192/… - Shadow

Puede utilizar el SearchView#setIconified() método en un identificador SearchView en su código Java. Más aquí:

http://developer.android.com/reference/android/widget/SearchView.html#setIconified(boolean)

También puedes hacer uso de SearchView#setIconifiedByDefault(). Más información aquí:

http://developer.android.com/reference/android/widget/SearchView.html#setIconifiedByDefault(boolean)

contestado el 27 de mayo de 15 a las 14:05

SearchView de MenuItemCompat tiene una propiedad denominada maxWidth.

final MenuItem searchItem = menu.findItem(R.id.action_search);
final SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
searchView.setMaxWidth(xxx);

use el ancho de pantalla en lugar de xxx por supuesto

Respondido 30 Jul 15, 12:07

Estoy usando Android.widget Searchview y estoy iconificado de manera predeterminada. El siguiente código en xml me ayudó a expandirlo y enfocarlo automáticamente en la vista de búsqueda, cuando se hace clic en:

<SearchView
                android:id="@+id/searchView"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:iconifiedByDefault="true"
                android:focusable="true"
                android:focusableInTouchMode="true"
                android:queryHint="Search"/>

Respondido 24 ago 17, 19:08

 <item
        android:id="@+id/search"
        android:icon="@drawable/ic_search"
        android:title="Search"
        app:actionViewClass="androidx.appcompat.widget.SearchView"
        app:showAsAction="always"/>

 public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.search_menu, menu);
        // Associate searchable configuration with the SearchView
        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        searchView = (SearchView) menu.findItem(R.id.search).getActionView();
        searchView.setQueryHint("Search the customer...");
        searchView.setSearchableInfo(Objects.requireNonNull(searchManager).getSearchableInfo(getComponentName()));
        searchView.setMaxWidth(Integer.MAX_VALUE);
        searchView.setIconifiedByDefault(false);
        searchView.requestFocus();

    }

<pre>

 <item
        android:id="@+id/search"
        android:icon="@drawable/ic_search"
        android:title="Search"
        app:actionViewClass="androidx.appcompat.widget.SearchView"
        app:showAsAction="always"/>

 public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.search_menu, menu);
        // Associate searchable configuration with the SearchView
        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        searchView = (SearchView) menu.findItem(R.id.search).getActionView();
        searchView.setQueryHint("Search the customer...");
        searchView.setSearchableInfo(Objects.requireNonNull(searchManager).getSearchableInfo(getComponentName()));
        searchView.setMaxWidth(Integer.MAX_VALUE);
        searchView.setIconifiedByDefault(false);
        searchView.requestFocus();

    }

</pre>

respondido 04 mar '20, 06:03

Me está funcionando correctamente, así que puedes probarlo. - chandan-raj

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.