Te recomendamos que utilices
SearchView
como un elemento en la barra de la app para proporcionar la función de búsqueda en tu app. Como
con todos los elementos en la barra de la app, puedes definir la SearchView
para
mostrar en todo momento o solo cuando haya espacio. También puedes definirlo como un
Acción contraíble, que muestra SearchView
como un ícono
y, luego, usa toda la barra de la app como campo de búsqueda cuando
toca el ícono.
Cómo agregar SearchView a la barra de la app
Para agregar un widget de SearchView
a la barra de la app, crea un archivo en tu
proyecto llamado res/menu/options_menu.xml
y agrega el siguiente código
al archivo. Este código define cómo crear el elemento de búsqueda, como el ícono
y el título del artículo. El atributo collapseActionView
permite que tu SearchView
se expanda para ocupar toda la barra de la aplicación.
se vuelve a contraer en un elemento normal de la barra de la aplicación cuando no se use. Debido a la
espacio limitado en la barra de la aplicación en teléfonos celulares, recomendamos usar la
el atributo collapsibleActionView
para brindar una mejor experiencia del usuario
una experiencia fluida a los desarrolladores.
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/search" android:title="@string/search_title" android:icon="@drawable/ic_search" android:showAsAction="collapseActionView|ifRoom" android:actionViewClass="androidx.appcompat.widget.SearchView" /> </menu>
Si quieres un ícono de búsqueda más accesible, crea un
ic_search.xml
en la carpeta /res/drawable
y
incluye el siguiente código:
<vector android:height="24dp" android:tint="#000000" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"> <path android:fillColor="@android:color/white" android:pathData="M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57l0.27,0.28v0.79l5,4.99L20.49,19l-4.99,-5zM9.5,14C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14z"/> </vector>
Para mostrar SearchView
en la barra de la app, aumenta el menú XML.
recurso res/menu/options_menu.xml
en la
onCreateOptionsMenu()
método de tu actividad:
Kotlin
override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.options_menu, menu) return true }
Cuando ejecutes la app, se generará algo como lo siguiente:
![Una imagen que muestra una pantalla vacía con un ícono de búsqueda en la barra superior de la app](https://developer.android.google.cn/static/images/ui/searchview_1.png?authuser=0000&hl=es)
El SearchView
aparece en la barra de la app de la app, pero no lo es.
y cómo funcionan. Si presionas el ícono de búsqueda, obtendrás algo como esto:
![Una imagen que muestra la vista de búsqueda en acción](https://developer.android.google.cn/static/images/ui/searchview_2.png?authuser=0000&hl=es)
SearchView
en acción.
Para que SearchView
funcione, debes definir cómo se
SearchView
se comporta.
Crea una configuración de búsqueda
Una búsqueda
configuración especifica cómo se comporta SearchView
se define en un archivo res/xml/searchable.xml
. Una configuración de búsqueda
debe contener, como mínimo, un atributo android:label
con el atributo
mismo valor que el atributo android:label
de la
<aplicación>
o <activity>
en tu manifiesto de Android. Sin embargo, también recomendamos agregar
El atributo android:hint
para darle al usuario una idea de lo que debe ingresar
en el cuadro de búsqueda.
<?xml version="1.0" encoding="utf-8"?> <searchable xmlns:android="http://schemas.android.com/apk/res/android" android:label="@string/app_name" android:hint="@string/search_hint" />
En el archivo de manifiesto de tu app, declara un
<meta-data>
que apunta al archivo res/xml/searchable.xml
. Declara el
de una <activity>
en la que quieres mostrar el
SearchView
<activity android:name=".SearchResultsActivity" android:exported="false" android:label="@string/title_activity_search_results" android:launchMode="singleTop" android:theme="@style/Theme.AppCompat.Light"> <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable" /> </activity>
En el método onCreateOptionsMenu()
que crees, asocia
la configuración de búsqueda con SearchView
llamando
setSearchableInfo(SearchableInfo)
:
Kotlin
override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.options_menu, menu) val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager val searchView = menu.findItem(R.id.search).actionView as SearchView val component = ComponentName(this, SearchResultsActivity::class.java) val searchableInfo = searchManager.getSearchableInfo(component) searchView.setSearchableInfo(searchableInfo) return true }
La llamada a
getSearchableInfo()
obtiene un
SearchableInfo
que se crea a partir del archivo en formato XML de configuración de búsqueda. Cuando la búsqueda
de configuración se asocia correctamente con tu SearchView
y el
envía una consulta, SearchView
inicia una actividad con el
ACTION_SEARCH
. Necesitas una actividad que pueda filtrar por este intent y manejar las
de búsqueda.
Cómo crear una actividad de búsqueda
Una actividad de búsqueda filtra para el intent ACTION_SEARCH
y
busca la consulta en un conjunto de datos. Para crear una actividad de búsqueda, declara
una actividad que elijas para filtrar ACTION_SEARCH
intent:
<activity android:name=".SearchResultsActivity" ... > ... <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> ... </activity>
En la actividad de búsqueda, maneja el intent ACTION_SEARCH
de la siguiente manera:
de verificarlo en tu
onCreate()
.
Kotlin
class SearchResultsActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_search_results) handleIntent(intent) } override fun onNewIntent(intent: Intent) { super.onNewIntent(intent) handleIntent(intent) } private fun handleIntent(intent: Intent) { if (Intent.ACTION_SEARCH == intent.action) { val query = intent.getStringExtra(SearchManager.QUERY) Log.d("SEARCH", "Search query was: $query") } } }
Ahora, SearchView
puede aceptar la consulta del usuario y comenzar tu
de búsqueda con el intent ACTION_SEARCH
.
Luego de obtener la búsqueda, puedes pasarla al
ViewModel
, donde puedes usarla en otras capas de tu
arquitectura para recuperar los resultados de búsqueda que se mostrarán.