Cómo configurar la interfaz de búsqueda

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
Figura 1: Un ícono de búsqueda en la barra superior de la app

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
Figura 2: 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.