Cómo crear una interfaz de búsqueda

Cuando estés listo para agregar una funcionalidad de búsqueda a tu app, Android te ayudará implementar la interfaz de usuario con un diálogo de búsqueda que aparece en la parte superior de la ventana de actividad o un widget de búsqueda que puedes insertar en tu diseño. Tanto el diálogo de búsqueda como el widget pueden entregar la consulta de búsqueda del usuario a una una actividad específica en tu app. De esta manera, el usuario puede iniciar una búsqueda desde cualquier actividad donde el diálogo o widget de búsqueda está disponible y el sistema inicia la actividad adecuada para realizar la búsqueda y presentar los resultados.

Otras funciones disponibles para el diálogo y el widget de búsqueda incluyen las siguientes:

  • Búsqueda por voz
  • Sugerencias de búsqueda basadas en consultas recientes
  • Sugerencias de búsqueda que coinciden con resultados reales en los datos de tu app

En este documento, se muestra cómo configurar tu app para proporcionar una interfaz de búsqueda que es asistida por el sistema Android para entregar búsquedas, mediante el diálogo o el widget de búsqueda.

Recursos relacionados:

Conceptos básicos

Antes de comenzar, decide si quieres implementar tu interfaz de búsqueda usando el diálogo de búsqueda o el widget de búsqueda. Proporcionan la misma búsqueda pero de maneras ligeramente diferentes:

  • El diálogo de búsqueda es un componente de la IU que controla el sistema Android. Cuando el usuario lo activa, el diálogo de búsqueda aparece en en la parte superior de la actividad.

    El sistema Android controla todos los eventos en el diálogo de búsqueda. Cuando un usuario envía una consulta, el sistema la envía a la actividad que que especifiques para manejar las búsquedas. El diálogo también puede proporcionar búsquedas sugerencias mientras el usuario escribe.

  • El widget de búsqueda es una instancia de SearchView que puedes colocar en cualquier parte del diseño. De forma predeterminada, el widget de búsqueda se comporta como un estándar EditText widget y no hace nada, pero puedes configurarlo para que la configuración de sistema que controla todos los eventos de entrada, entrega las consultas al y proporciona sugerencias de búsqueda, al igual que la .

Cuando el usuario ejecuta una búsqueda desde el diálogo o widget de búsqueda, el sistema crea Intent y almacena la consulta del usuario en él. Luego, el sistema inicia la actividad que declarar para manejar búsquedas, la "actividad de búsqueda", y la entrega el intent. Para configurar tu app para este tipo de búsqueda asistida, necesitas la lo siguiente:

  • Una configuración de búsqueda
    Es un archivo en formato XML que establece algunos parámetros de configuración para el diálogo o widget de búsqueda. Incluye parámetros de configuración para funciones como búsqueda por voz, sugerencia de búsqueda, y texto de sugerencias para el cuadro de búsqueda.
  • Actividad de búsqueda
    Activity que recibe la búsqueda, busca tus datos y muestra la búsqueda resultados.
  • Una interfaz de búsqueda, proporcionada por cualquiera de las siguientes opciones:
    • El diálogo de búsqueda
      De forma predeterminada, el diálogo de búsqueda está oculto. Aparece en la parte superior filtrar cuando llames onSearchRequested() Cuando el usuario presiona el botón Buscar.
    • Un SearchView widget
      El widget de búsqueda te permite colocar el cuadro de búsqueda en cualquier parte de la incluso como una vista de acción en la barra de la app.

En el resto de este documento, se muestra cómo crear la configuración de búsqueda de búsqueda y de búsqueda, y cómo implementar una interfaz de búsqueda con el o un widget de búsqueda.

Crea una configuración que se pueda buscar

Lo primero que necesitas es un archivo en formato XML llamado configuración de búsqueda. Configura ciertos aspectos de la IU del diálogo o widget de búsqueda y define cómo funciones como las sugerencias y la búsqueda por voz. Tradicionalmente, este archivo con el nombre searchable.xml y debe guardarse en el archivo res/xml/ del proyecto.

El archivo de configuración de búsqueda debe incluir los <searchable> como su nodo raíz y especificar uno o más atributos, como se muestra en el siguiente ejemplo:

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:label="@string/app_label"
    android:hint="@string/search_hint" >
</searchable>

El atributo android:label es el único atributo requerido. Integra apunta a un recurso de cadenas, que debe ser el nombre de la app. La etiqueta no está visibles para el usuario hasta que habilites las sugerencias de búsqueda para el cuadro de búsqueda rápida, en En qué punto aparecerá la etiqueta en la lista de elementos que se pueden buscar en el sistema. configuración.

Aunque no es obligatorio, te recomendamos que siempre incluyas Atributo android:hint, que proporciona una cadena de sugerencia en la búsqueda antes de que los usuarios ingresen una consulta. La pista es importante porque proporciona pistas importantes a los usuarios sobre lo que pueden buscar.

El elemento <searchable> acepta muchos otros atributos. Sin embargo, no necesitarás la mayoría de los atributos hasta que agregues funciones como los siguientes: sugerencias de búsqueda y búsqueda por voz. Para obtener información detallada sobre el de configuración de Terraform, consulta la Configuración de búsqueda documento de referencia.

Cómo crear una actividad de búsqueda

Una actividad de búsqueda es el Activity de tu app que realiza búsquedas basadas en una cadena de consulta y presenta los resultados de la búsqueda.

Cuando el usuario ejecuta una búsqueda en el diálogo o widget de búsqueda, el sistema inicia tu actividad de búsqueda y le entrega la búsqueda en una Intent con el ACTION_SEARCH acción. La actividad de búsqueda recupera la consulta del directorio QUERY extra, busca tus datos y presenta los resultados.

Como puedes incluir el diálogo o widget de búsqueda en cualquier otra actividad en tu app, el sistema debe saber cuál es tu actividad de búsqueda para para que pueda entregar correctamente la búsqueda. Por lo tanto, primero declara en el archivo de manifiesto de Android.

Cómo declarar una actividad de búsqueda

Si aún no tienes uno, crea un Activity que tenga un buen rendimiento. y presenta los resultados. No es necesario que implementes el método solo tienes que crear una actividad que puedas declarar en el . Dentro del archivo de manifiesto <activity> haz lo siguiente:

  1. Declara la actividad para aceptar el intent ACTION_SEARCH en una <intent-filter> .
  2. Especifica la configuración de búsqueda que se usará en un <meta-data> .

Esto se muestra en el siguiente ejemplo:

<application ... >
    <activity android:name=".SearchableActivity" >
        <intent-filter>
            <action android:name="android.intent.action.SEARCH" />
        </intent-filter>
        <meta-data android:name="android.app.searchable"
                   android:resource="@xml/searchable"/>
    </activity>
    ...
</application>

El elemento <meta-data> debe incluir el Atributo android:name con un valor de "android.app.searchable" y android:resource con una referencia al archivo de configuración de búsqueda. En la ejemplo anterior, se refiere a res/xml/searchable.xml .

Realizar una búsqueda

Después de declarar tu actividad de búsqueda en el manifiesto, sigue este procedimiento para realizar una búsqueda en tu actividad de búsqueda:

  1. Recibe la consulta.
  2. Busca tus datos.
  3. Presenta los resultados.

Recibir la consulta

Cuando un usuario ejecuta una búsqueda desde el widget o diálogo de búsqueda, el sistema inicia tu actividad de búsqueda y le envía un elemento ACTION_SEARCH. . Este intent lleva la búsqueda en la cadena QUERY adicionales. Busca este intent cuando comience la actividad y extrae la cadena. Por ejemplo, así puedes obtener la búsqueda cuando inicio de la actividad:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.search)

    // Verify the action and get the query.
    if (Intent.ACTION_SEARCH == intent.action) {
        intent.getStringExtra(SearchManager.QUERY)?.also { query ->
            doMySearch(query)
        }
    }
}

Java

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.search);

    // Get the intent, verify the action, and get the query.
    Intent intent = getIntent();
    if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
      String query = intent.getStringExtra(SearchManager.QUERY);
      doMySearch(query);
    }
}

La cadena QUERY siempre se incluye con el ACTION_SEARCH. En el ejemplo anterior, la consulta está se recupera y se pasa a un método doMySearch() local, en el que la operación de búsqueda real.

Busca tus datos

El proceso de almacenar y buscar tus datos es único para tu app. Puedes cómo almacenar y buscar datos de muchas maneras. En este documento, no se muestra cómo hacerlo. Considera cómo almacenas y buscas tus datos en función de tus necesidades y datos de un conjunto de datos tengan un formato común. Estas son algunas sugerencias que puedes aplicar:

  • Si tus datos están almacenados en una base de datos SQLite en el dispositivo, realizar una búsqueda en el texto completo, con FTS3, en lugar de LIKE puede proporcionar una búsqueda más sólida en datos de texto y también generan resultados mucho más rápido. Consulta sqlite.org para información sobre FTS3 y las SQLiteDatabase para obtener información sobre SQLite en Android.
  • Si tus datos se almacenan en línea, entonces el rendimiento de búsqueda percibido podría pueden inhibirse por la conexión de datos del usuario. Es posible que quieras mostrar un indicador de progreso hasta que devuelva la búsqueda. Consulta android.net para obtener una referencia de las APIs de red y ProgressBar para obtener información sobre cómo mostrar un indicador de progreso.

Presenta los resultados

Independientemente de dónde se encuentren tus datos y cómo los busques, te recomendamos que devuelves los resultados de la búsqueda a tu actividad de búsqueda con una Adapter Esta puedes presentar todos los resultados de la búsqueda de una RecyclerView Si tus datos provienen de una consulta de la base de datos SQLite, puedes aplicar los resultados a una RecyclerView con un CursorAdapter Si tus datos vienen en un formato diferente, puedes crear una extensión de BaseAdapter

Un Adapter vincula cada elemento de un conjunto de datos a un View. Cuándo se aplica Adapter a RecyclerView, cada pieza de datos se inserta como una vista individual en la lista. Adapter es solo una interfaz, por lo que implementaciones como CursorAdapter, para vincular datos desde un Cursor—son según tus necesidades. Si ninguna de las implementaciones existentes funciona para tus datos, puedes implementa el tuyo desde BaseAdapter.

Cómo usar el diálogo de búsqueda

El diálogo de búsqueda proporciona un cuadro de búsqueda flotante en la parte superior de la pantalla. con el ícono de la app a la izquierda. El diálogo de búsqueda puede proporcionar sugerencias de búsqueda a medida que el usuario escribe. Cuando el usuario ejecuta una búsqueda, el sistema la envía una consulta a una actividad de búsqueda que realiza la búsqueda.

De forma predeterminada, el diálogo de búsqueda siempre está oculto hasta que el usuario lo activa. Tu app puede activar el diálogo de búsqueda llamando onSearchRequested() Sin embargo, este método no funciona hasta que habilitar el diálogo de búsqueda de la actividad.

Para permitir que el diálogo de búsqueda realice búsquedas, indícale al sistema el La actividad de búsqueda debe recibir consultas de búsqueda del diálogo de búsqueda. Para ejemplo, en la sección anterior sobre crear una actividad de búsqueda, un formato se crea la actividad llamada SearchableActivity. Si quieres un separada, como una llamada OtherActivity, para mostrar el cuadro de diálogo de búsqueda y enviar búsquedas a SearchableActivity, declarar en el manifiesto que SearchableActivity es la actividad de búsqueda para usar en el diálogo de búsqueda en OtherActivity.

Para declarar la actividad de búsqueda del diálogo de búsqueda de una actividad, agrega un <meta-data> dentro del elemento de la actividad correspondiente elemento <activity>. El <meta-data> debe incluir el atributo android:value que especifica la el nombre de clase de la actividad de búsqueda y el atributo android:name con un valor de "android.app.default_searchable".

Por ejemplo, esta es la declaración para una actividad de búsqueda: SearchableActivity y otra actividad, OtherActivity, que usa SearchableActivity para realizar búsquedas ejecutadas desde su diálogo de búsqueda:

<application ... >
    <!-- This is the searchable activity; it performs searches. -->
    <activity android:name=".SearchableActivity" >
        <intent-filter>
            <action android:name="android.intent.action.SEARCH" />
        </intent-filter>
        <meta-data android:name="android.app.searchable"
                   android:resource="@xml/searchable"/>
    </activity>

    <!-- This activity enables the search dialog to initiate searches
         in the SearchableActivity. -->
    <activity android:name=".OtherActivity" ... >
        <!-- Enable the search dialog to send searches to SearchableActivity. -->
        <meta-data android:name="android.app.default_searchable"
                   android:value=".SearchableActivity" />
    </activity>
    ...
</application>

Dado que OtherActivity ahora incluye un Elemento <meta-data> para declarar a qué actividad de búsqueda usar para las búsquedas, la actividad habilita el diálogo de búsqueda. Si bien el usuario está En esta actividad, el método onSearchRequested() activa la en el cuadro de diálogo de búsqueda. Cuando el usuario ejecuta la búsqueda, el sistema inicia SearchableActivity y lo entrega el ACTION_SEARCH .

Si quieres que todas las actividades de tu app proporcionen el diálogo de búsqueda, inserta el elemento <meta-data> anterior como elemento secundario de <application> en lugar de cada elemento <activity>. De esta manera, todas las actividades hereda el valor, proporciona el diálogo de búsqueda y envía las búsquedas a la misma actividad de búsqueda. Si tienes varias actividades de búsqueda, puedes anular la actividad de búsqueda predeterminada colocando una etiqueta <meta-data> dentro de actividades individuales.

Con el diálogo de búsqueda habilitado para tus actividades, tu app está lista para realizar búsquedas.

Cómo invocar el diálogo de búsqueda

Aunque algunos dispositivos proporcionan un botón de búsqueda exclusivo, el comportamiento de la puede variar según el dispositivo y muchos dispositivos no proporcionan una en absoluto. Por eso, cuando uses el diálogo de búsqueda, debes proporcionar un botón de búsqueda en tu IU que activa el diálogo de búsqueda llamando onSearchRequested()

Por ejemplo, agrega un botón de búsqueda en tu El menú de opciones o el diseño de la IU que llame a onSearchRequested().

También puedes habilitar la opción "Escribir para buscar" en la nube, que activa diálogo de búsqueda cuando el usuario comienza a escribir en el teclado. Las combinaciones de teclas insertar en el diálogo de búsqueda. Puedes habilitar la función de escribir para buscar en tu actividad llamando setDefaultKeyMode o DEFAULT_KEYS_SEARCH_LOCAL, durante de tus actividades onCreate() .

El impacto del diálogo de búsqueda en el ciclo de vida de la actividad

El diálogo de búsqueda es un Dialog que flota en la parte superior de la pantalla. No causa ningún cambio en la pila de actividades, así que cuando aparece el diálogo de búsqueda, no hay métodos de ciclo de vida, como onPause()—son llamado. Tu actividad pierde el foco de entrada porque se le da a la en el cuadro de diálogo de búsqueda.

Si deseas recibir una notificación cuando el diálogo de búsqueda esté activado, anula el onSearchRequested(). Cuando el sistema llama a este método, es una indicación de que tu actividad pierde el foco de entrada para el diálogo de búsqueda, de modo que puedes realizar cualquier trabajo apropiado para el evento, como pausar un juego. Salvo que estás pasando el contexto de búsqueda datos, que se analiza en otra sección de este documento, finaliza el llamando a la implementación de la superclase:

Kotlin

override fun onSearchRequested(): Boolean {
    pauseSomeStuff()
    return super.onSearchRequested()
}

Java

@Override
public boolean onSearchRequested() {
    pauseSomeStuff();
    return super.onSearchRequested();
}

Si el usuario cancela la búsqueda presionando el botón Atrás, el cuadro de diálogo de búsqueda se cierra y la actividad recupera el enfoque de entrada. Regístrate para recibir notificaciones Cuando el diálogo de búsqueda se cierra con setOnDismissListener(), setOnCancelListener(), o ambas. Solo debes registrar el OnDismissListener, porque se llama cada vez que se cierra el diálogo de búsqueda. El OnCancelListener solo se refiere a eventos en los que el usuario sale explícitamente del diálogo de búsqueda. no se llama cuando se ejecuta una búsqueda. Cuando se ejecuta la búsqueda, el el cuadro de diálogo de búsqueda desaparece automáticamente.

Si la actividad actual no es la de búsqueda, la actividad Los eventos de ciclo de vida de una actividad se activan cuando el usuario ejecuta un búsqueda: la actividad actual recibe onPause(), como se describe en Introducción a actividades. Sin embargo, si la actividad actual es la de búsqueda, sucede una de dos cosas:

  • De forma predeterminada, la actividad de búsqueda recibe el ACTION_SEARCH con una llamada a onCreate(), y una nueva instancia de la actividad se lleva a la parte superior de la actividad en una pila. Ahora hay dos instancias de tu actividad de búsqueda en la de la pila de actividades, por lo que presionar el botón Atrás te llevará a la anterior de la actividad de búsqueda, en lugar de salir de la actividad.
  • Si configuras android:launchMode como "singleTop", Luego, la actividad de búsqueda recibe el intent ACTION_SEARCH con una llamada a onNewIntent(Intent), que pasa el nuevo intent ACTION_SEARCH. Por ejemplo, aquí te mostramos cómo podrías manejar este caso, en el que el modo de lanzamiento de la actividad de búsqueda es "singleTop":

    Kotlin

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.search)
        handleIntent(intent)
    }
    
    override fun onNewIntent(intent: Intent) {
        super.onNewIntent(intent)
        setIntent(intent)
        handleIntent(intent)
    }
    
    private fun handleIntent(intent: Intent) {
        if (Intent.ACTION_SEARCH == intent.action) {
            intent.getStringExtra(SearchManager.QUERY)?.also { query ->
                doMySearch(query)
            }
        }
    }
    

    Java

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.search);
        handleIntent(getIntent());
    }
    
    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        handleIntent(intent);
    }
    
    private void handleIntent(Intent intent) {
        if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
          String query = intent.getStringExtra(SearchManager.QUERY);
          doMySearch(query);
        }
    }
    

    En comparación con el código de ejemplo en la sección sobre realizar una búsqueda, todo el código para manejar las la intención de búsqueda ahora está en el método handleIntent(), de modo que onCreate() y onNewIntent() pueden ejecutarlo.

    Cuando el sistema llama a onNewIntent(Intent), la actividad no se reiniciarse, por lo que getIntent() muestra el mismo intent que se recibe con onCreate(). Por eso debes llamar a setIntent(Intent) dentro de onNewIntent(Intent): para que el intent guardado por el se actualiza la actividad en caso de que llames a getIntent() en el futuro.

La segunda situación, con el modo de lanzamiento "singleTop", suele ser preferible porque, después de hacer una búsqueda, el usuario puede realizar búsquedas y no deseas que tu app cree varias instancias de la actividad de búsqueda. Te recomendamos que configures la actividad de búsqueda en Modo de lanzamiento "singleTop" en el manifiesto de la app, como se muestra en el siguiente ejemplo:

<activity android:name=".SearchableActivity"
          android:launchMode="singleTop" >
    <intent-filter>
        <action android:name="android.intent.action.SEARCH" />
    </intent-filter>
    <meta-data
          android:name="android.app.searchable"
          android:resource="@xml/searchable"/>
  </activity>

Cómo pasar datos de contexto de búsqueda

En algunos casos, puedes definir mejor la búsqueda que se incluye la actividad de búsqueda de cada búsqueda realizada. Sin embargo, si deseas definir mejor los criterios de búsqueda en función de la actividad en la que el usuario realiza una puedes proporcionar datos adicionales en el intent que el sistema envía tu actividad de búsqueda. Puedes pasar los datos adicionales en el APP_DATA Bundle, que es incluido en el intent ACTION_SEARCH.

Para pasar este tipo de datos a tu actividad de búsqueda, anula el parámetro Método onSearchRequested() para la actividad desde la que el usuario puede Realiza una búsqueda, crea un objeto Bundle con los datos adicionales. llamar startSearch() para activar el diálogo de búsqueda. Por ejemplo:

Kotlin

override fun onSearchRequested(): Boolean {
    val appData = Bundle().apply {
        putBoolean(JARGON, true)
    }
    startSearch(null, false, appData, false)
    return true
}

Java

@Override
public boolean onSearchRequested() {
     Bundle appData = new Bundle();
     appData.putBoolean(SearchableActivity.JARGON, true);
     startSearch(null, false, appData, false);
     return true;
 }

Un resultado verdadero indica que manejas correctamente este evento de devolución de llamada y Llama a startSearch() para activar el diálogo de búsqueda. Después de que el usuario envía una consulta, se entrega a tu actividad de búsqueda junto con los datos que agregues. Puedes extraer los datos adicionales de APP_DATA. Bundle para definir mejor la búsqueda, como se muestra en el siguiente ejemplo:

Kotlin

val jargon: Boolean = intent.getBundleExtra(SearchManager.APP_DATA)?.getBoolean(JARGON) ?: false

Java

Bundle appData = getIntent().getBundleExtra(SearchManager.APP_DATA);
if (appData != null) {
    boolean jargon = appData.getBoolean(SearchableActivity.JARGON);
}

Usa el widget de búsqueda

Una imagen que muestra una vista de búsqueda en la barra superior de la app

Figura 1: El widget SearchView como una vista de acción en la barra de la aplicación.

El widget de búsqueda proporciona la misma funcionalidad que el diálogo de búsqueda. Integra inicia la actividad correspondiente cuando el usuario ejecuta una búsqueda, y puede proporcionar sugerencias de búsqueda y realizar búsquedas por voz. Si no es una opción para colocar el widget de búsqueda en la barra de la app, puedes colocar en alguna parte del diseño de tu actividad.

Cómo configurar el widget de búsqueda

Después de crear un configuración de búsqueda y una actividad de búsqueda, habilitar la búsqueda asistida para cada SearchView llamando setSearchableInfo() y pásale el objeto SearchableInfo que representa tu configuración de búsqueda.

Para obtener una referencia al SearchableInfo, llama a getSearchableInfo() activado SearchManager

Por ejemplo, si usas un objeto SearchView como vista de acción en la barra de la aplicación, habilita el widget durante la onCreateOptionsMenu() la devolución de llamada, como se muestra en el siguiente ejemplo:

Kotlin

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    // Inflate the options menu from XML.
    val inflater = menuInflater
    inflater.inflate(R.menu.options_menu, menu)

    // Get the SearchView and set the searchable configuration.
    val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager
    (menu.findItem(R.id.menu_search).actionView as SearchView).apply {
        // Assumes current activity is the searchable activity.
        setSearchableInfo(searchManager.getSearchableInfo(componentName))
        setIconifiedByDefault(false) // Don't iconify the widget. Expand it by default.
    }

    return true
}

Java

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the options menu from XML.
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.options_menu, menu);

    // Get the SearchView and set the searchable configuration.
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
    // Assumes current activity is the searchable activity.
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
    searchView.setIconifiedByDefault(false); // Don't iconify the widget. Expand it by default.

    return true;
}

El widget de búsqueda ya está configurado, y el sistema envía consultas de búsqueda a tu actividad de búsqueda. También puedes habilitar sugerencias de búsqueda para el widget de búsqueda.

Para obtener más información sobre las vistas de acción en la barra de la app, consulta Cómo usar vistas y acciones de acción del proveedor de servicios en la nube.

Otras funciones del widget de búsqueda

El widget SearchView ofrece algunas funciones adicionales que podría querer:

Un botón Enviar
De forma predeterminada, no hay ningún botón para enviar una búsqueda, por lo que el usuario presiona la tecla Intro en el teclado para iniciar una búsqueda. Tú puede agregar la etiqueta "enviar" llamando setSubmitButtonEnabled(true)
Mejora en la definición de consultas para sugerencias de búsqueda
Cuando habilitas las sugerencias de búsqueda, sueles esperar que los usuarios seleccionen un sugerencia, pero es posible que también quiera definir mejor la búsqueda sugerida. Puedes agregar un botón junto a cada sugerencia que la inserte. en el cuadro de búsqueda para que el usuario lo perfeccione mediante una llamada setQueryRefinementEnabled(true)
La capacidad de activar o desactivar la visibilidad del cuadro de búsqueda
De forma predeterminada, el widget de búsqueda está “iconificado”, lo que significa que es representados solo por un icono de búsqueda: una lupa. Se expande a mostrar el cuadro de búsqueda cuando el usuario presione el ícono. Como se muestra en el ejemplo anterior Por ejemplo, puedes mostrar el cuadro de búsqueda de forma predeterminada llamando setIconifiedByDefault(false) También puedes activar o desactivar la apariencia del widget de búsqueda llamando setIconified()

Hay muchas otras APIs en la clase SearchView que permiten puedes personalizar el widget de búsqueda. Sin embargo, la mayoría de ellos solo se usan cuando controlar todas las entradas del usuario tú mismo, en lugar de usar el sistema Android para proporcionar y mostrar sugerencias de búsqueda.

Usa el widget y el diálogo

Si insertas el widget de búsqueda en la barra de la app como una vista de acción y habilite para que aparezca en la barra de la aplicación si hay espacio, estableciendo android:showAsAction="ifRoom", entonces el widget de búsqueda podría no aparecen como una vista de acción. En su lugar, es posible que aparezca un elemento de menú en el menú . Por ejemplo, si tu app se ejecuta en una pantalla más pequeña, es posible que no haya espacio suficiente en la barra de la aplicación para mostrar el widget de búsqueda junto con otras acciones. elementos o elementos de navegación, por lo que el elemento de menú aparece en el menú ampliado . Cuando se coloca en el menú ampliado, el elemento funciona como un menú común. elemento y no muestra la vista de acción, es decir, el widget de búsqueda.

Para resolver esta situación, el elemento de menú al que adjuntaste el widget de búsqueda debe activar el diálogo de búsqueda cuando el usuario lo selecciona en el menú ampliado. Para que esto suceda, implementa onOptionsItemSelected() para procesar la búsqueda elemento de menú y abrir el diálogo de búsqueda llamando onSearchRequested()

Para obtener más información sobre el funcionamiento de los elementos de la barra de la aplicación y cómo manejarlos esta situación, consulta Agrega la barra de la app.

Agrega la búsqueda por voz

Puedes agregar la función de búsqueda por voz a tu diálogo o widget de búsqueda; para ello, haz lo siguiente: Agrega el atributo android:voiceSearchMode al archivo configuración. Esto agregará un botón de búsqueda por voz que iniciará un mensaje de voz. Cuando el usuario termina de hablar, la búsqueda transcrita se envía a tu actividad de búsqueda.

Esto se muestra en el siguiente ejemplo:

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:label="@string/search_label"
    android:hint="@string/search_hint"
    android:voiceSearchMode="showVoiceSearchButton|launchRecognizer" >
</searchable>

Se requiere el valor showVoiceSearchButton para habilitar la voz búsqueda. El segundo valor, launchRecognizer, especifica que el valor botón de búsqueda por voz debe iniciar un reconocidor que devuelva el transcrito texto a la actividad de búsqueda.

Puedes proporcionar atributos adicionales para especificar el comportamiento de la búsqueda por voz. como el idioma esperado y la cantidad máxima de resultados que se mostrarán. Consulta la referencia Configuración de búsqueda para obtener más información información sobre los atributos disponibles.

Agrega sugerencias de búsqueda

Tanto el diálogo como el widget de búsqueda pueden proporcionar sugerencias de búsqueda. a medida que el usuario escribe, con la ayuda del sistema Android. El sistema administra la lista de sugerencias y controla el evento cuando el usuario selecciona un sugerencia.

Puedes proporcionar dos tipos de sugerencias de búsqueda:

Sugerencias de búsquedas recientes
Estas sugerencias son palabras que el usuario utilizó anteriormente como búsqueda consultas en tu app. Consulta Agregar sugerencias de búsqueda personalizadas para obtener más información.
Sugerencias de búsqueda personalizadas
Estas son sugerencias de búsqueda que proporcionas desde tu propia fuente de datos a Ayudar a los usuarios a seleccionar de inmediato la ortografía o el elemento correctos que buscan . Consulte Cómo agregar una búsqueda personalizada sugerencias para obtener más información.