Expandir y dar foco a SearchView automáticamente
Frecuentes
Visto 90,242 equipos
79
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?
18 Respuestas
104
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
61
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
113
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
27
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 View
no, 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
2
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
2
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
1
Llame a expandActionView()
en el elemento del menú.
menuItem.expandActionView()
contestado el 21 de mayo de 20 a las 03:05
1
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
6
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
2
Para Appcompat Searchview puede utilizar este método:
MenuItemCompat.expandActionView(mSearchMenuItem);
Respondido el 19 de Septiembre de 17 a las 14:09
8
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
2
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
-2
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
4
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
2
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
0
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
0
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
0
<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 android search focus expand or haz tu propia pregunta.
No estoy seguro para ser honesto, lo siento. - Alex Curran
Añadiendo un
requestFocus()
llamaronPrepareOptionsMenu(..)
hizo el truco para mí. - El sucio calvinistarequestFocus
no funciona para mi Para "enfocar" puedes llamarsetIconified
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