Criar uma interface de pesquisa

Quando estiver tudo pronto para adicionar a funcionalidade de pesquisa ao app, o Android vai ajudar você implementar a interface do usuário com uma caixa de diálogo de pesquisa que aparece na parte superior da janela de atividades ou de um widget de pesquisa que você pode inserir no seu layout. A caixa de diálogo e o widget podem fornecer a consulta de pesquisa do usuário a um uma atividade específica no seu aplicativo. Dessa forma, o usuário pode iniciar uma pesquisa a partir de qualquer atividade em que a caixa de diálogo ou o widget de pesquisa está disponível e o sistema é iniciado a atividade apropriada para realizar a pesquisa e apresentar resultados.

Outros recursos disponíveis para a caixa e o widget de pesquisa incluem:

  • Pesquisa por voz
  • Sugestões de pesquisa com base em consultas recentes
  • Sugestões de pesquisa que correspondem aos resultados reais nos dados do app

Este documento mostra como configurar seu app para oferecer uma interface de pesquisa assistida pelo sistema Android a entregar consultas de pesquisa, usando na caixa de diálogo ou no widget de pesquisa.

Recursos relacionados:

Noções básicas

Antes de começar, decida se você quer implementar a interface de pesquisa usando a caixa de diálogo ou o widget de pesquisa. Eles fornecem a mesma pesquisa mas de formas ligeiramente diferentes:

  • A caixa de pesquisa é um componente de IU controlado pela no sistema Android. Quando ativada pelo usuário, a caixa de diálogo de pesquisa aparece no topo da atividade.

    O sistema Android controla todos os eventos na caixa de pesquisa. Quando o usuário envia uma consulta, o sistema entrega a consulta à atividade que você especificar para lidar com as pesquisas. A caixa de diálogo também pode oferecer recursos sugestões enquanto o usuário digita.

  • O widget de pesquisa é uma instância do SearchView que você pode em qualquer lugar do layout. Por padrão, o widget de pesquisa se comporta como padrão EditText e não faz nada, mas é possível configurá-lo para que o Android sistema lida com todos os eventos de entrada, envia as consultas para os atividade e fornece sugestões de pesquisa, assim como o caixa de diálogo.
.

Quando o usuário faz uma pesquisa na caixa de diálogo ou widget de pesquisa, o sistema cria Intent e que armazena a consulta do usuário nele. O sistema então inicia a atividade que você declarar para processar pesquisas (a "atividade de pesquisa") e a entrega o intent. Para configurar seu app para esse tipo de pesquisa assistida, você precisa do seguinte:

  • Uma configuração de pesquisa
    Um arquivo XML que define algumas configurações para a caixa ou o widget de pesquisa. Ele inclui configurações de recursos como pesquisa por voz, sugestão de pesquisa, e dica para a caixa de pesquisa.
  • Uma atividade de pesquisa
    O Activity que recebe a consulta de pesquisa, pesquisa seus dados e exibe a resultados.
  • Uma interface de pesquisa, fornecida por um dos seguintes:
    • Caixa de diálogo de pesquisa
      Por padrão, a caixa de pesquisa fica oculta. Ele aparece na parte superior tela ao ligar onSearchRequested() quando o usuário toca no botão Pesquisar.
    • Um SearchView widget
      O uso do widget de pesquisa permite colocar a caixa de pesquisa em qualquer lugar do seu atividade, inclusive como uma visualização de ações na barra de apps.

O restante deste documento mostra como criar a configuração de pesquisa atividade de pesquisa e como implementar uma interface de pesquisa com o caixa de diálogo ou widget de pesquisa.

Criar uma configuração pesquisável

A primeira coisa que você precisa é de um arquivo XML chamado configuração de pesquisa. Ele configura certos aspectos da IU da caixa ou do widget de pesquisa e define como como as sugestões e a pesquisa por voz. Tradicionalmente, esse arquivo chamado searchable.xml e precisa ser salvo na pasta res/xml/ do projeto.

O arquivo de configuração de pesquisa precisa incluir o parâmetro <searchable> elemento como seu nó raiz e especificar um ou mais atributos, como mostrado no exemplo a seguir:

<?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>

O atributo android:label é o único atributo obrigatório. Ela aponta para um recurso de string, que precisa ser o nome do app. Este marcador não está visível para o usuário até que você ative as sugestões de pesquisa para a Caixa de pesquisa rápida, em o ponto em que o marcador fica visível na lista de itens pesquisáveis no sistema; configurações.

Embora não seja obrigatório, recomendamos que você sempre inclua o parâmetro O atributo android:hint, que fornece uma string de dica na pesquisa antes de os usuários inserirem uma consulta. A dica é importante porque fornece pistas importantes para os usuários sobre o que eles podem pesquisar.

O elemento <searchable> aceita vários outros atributos. No entanto, você não precisa da maioria dos atributos até adicionar recursos como sugestões de pesquisa e pesquisa por voz. Para informações detalhadas sobre o de configuração de pesquisa, consulte a Configuração de pesquisa documento de referência.

Criar uma atividade de pesquisa

Uma atividade de pesquisa é a Activity no app que executa pesquisa com base em uma string de consulta e apresenta os resultados da pesquisa.

Quando o usuário executa uma pesquisa na caixa de diálogo ou no widget de pesquisa, o sistema inicia sua atividade de pesquisa e envia a consulta de pesquisa em um Intent com o ACTION_SEARCH à ação. Sua atividade de pesquisa recupera a consulta do QUERY e pesquisa seus dados e apresenta os resultados.

Como é possível incluir a caixa de diálogo ou o widget de pesquisa em qualquer outra atividade no seu app, o sistema precisa saber qual atividade é sua atividade de pesquisa. para que ele possa exibir corretamente a consulta de pesquisa. Portanto, primeiro declare sua função atividade no arquivo de manifesto do Android.

Declarar uma atividade de pesquisa

Se você ainda não tiver uma Activity, crie uma que seja executada pesquisa e apresenta resultados. Não é necessário implementar a função funcionalidade, basta criar uma atividade que você pode declarar no arquivo manifesto do aplicativo. Dentro do arquivo <activity> , faça o seguinte:

  1. Declare a atividade para aceitar a intent ACTION_SEARCH em uma <intent-filter> .
  2. Especifique a configuração de pesquisa a ser usada em um <meta-data> .

Isso é mostrado neste exemplo:

<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>

O elemento <meta-data> precisa incluir o Atributo android:name com um valor de "android.app.searchable" e android:resource com uma referência ao arquivo de configuração pesquisável. Na exemplo anterior, ele se refere ao res/xml/searchable.xml .

Realizar uma pesquisa

Depois de declarar sua atividade de pesquisa no manifesto, siga estas para realizar uma pesquisa na sua atividade de pesquisa:

  1. Receber a consulta.
  2. Pesquise seus dados.
  3. Apresente os resultados.

Receber a consulta

Quando um usuário executa uma pesquisa na caixa de diálogo ou no widget de pesquisa, o sistema inicia sua atividade de pesquisa e envia a ela um ACTION_SEARCH intenção. Essa intent carrega a consulta de pesquisa na string QUERY extra. Verifique essa intent quando a atividade iniciar e extraia a string. Por exemplo, veja como obter a consulta de pesquisa quando seu início da atividade:

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);
    }
}

A string QUERY sempre é incluída no ACTION_SEARCH. No exemplo anterior, a consulta recuperados e passados para um método doMySearch() local em que o quando a operação de pesquisa real é concluída.

Pesquisar seus dados

O processo de armazenamento e pesquisa de dados é exclusivo do app. Você pode armazenar e pesquisar seus dados de várias maneiras, mas este documento não mostra como fazer isso. Considere como você armazena e pesquisa seus dados de acordo com suas necessidades e dados . Confira algumas dicas que você pode aplicar:

  • Caso seus dados estejam armazenados em um banco de dados SQLite no dispositivo, realizar uma Pesquisa de texto completo: usando FTS3 em vez de uma LIKE. pode fornecer uma pesquisa mais robusta em dados de texto e pode a produzir resultados significativamente mais rápidos. Consulte sqlite.org para informações sobre o FTS3 e as SQLiteDatabase para informações sobre o SQLite no Android.
  • Se seus dados estão armazenados on-line, o desempenho da pesquisa percebido pode ser inibido pela conexão de dados do usuário. Você pode querer exibir indicador de progresso até que a pesquisa seja retornada. Consulte android.net para consultar uma referência das APIs de rede e ProgressBar para mais informações sobre como exibir um indicador de progresso.
.

Apresentar os resultados

Independentemente de onde os dados estão e de como são pesquisados, recomendamos que você retorna os resultados da pesquisa para sua atividade de pesquisa com um Adapter: Isso é possível apresentar todos os resultados da pesquisa RecyclerView: Se seus dados vierem de uma consulta ao banco de dados SQLite, você pode aplicar os resultados a uma RecyclerView usando um CursorAdapter. Se seus dados vêm em um formato diferente, você pode criar uma extensão do BaseAdapter:

Um Adapter vincula cada item de um conjunto de dados a uma objeto View. Quando o Adapter é aplicado a um RecyclerView, cada parte de dados é inserida como uma visualização individual na lista. Adapter é apenas uma interface. Portanto, implementações como CursorAdapter: para vincular dados de uma Cursor—são necessários. Se nenhuma das implementações existentes funcionar para seus dados, será possível implemente um de BaseAdapter.

Usar a caixa de pesquisa

A caixa de pesquisa oferece uma caixa de pesquisa flutuante na parte superior da tela, com o ícone do app à esquerda. A caixa de diálogo pode oferecer sugestões de pesquisa conforme o usuário digita. Quando o usuário faz uma pesquisa, o sistema envia o resultado consulta para uma atividade de pesquisa que realiza a pesquisa.

Por padrão, a caixa de diálogo de pesquisa fica sempre oculta até o usuário ativá-la. Seu app pode ativar a caixa de pesquisa chamando onSearchRequested(): No entanto, esse método não funciona até que você ativar a caixa de diálogo de pesquisa para a atividade.

Para que a caixa de diálogo de pesquisa realize pesquisas, indique ao sistema quais a atividade de pesquisa precisa receber consultas da caixa de diálogo de pesquisa. Para exemplo, na seção anterior sobre criar uma atividade pesquisável, uma atividade pesquisável a atividade SearchableActivity é criada. Se você quiser uma atividade separada, como uma chamada OtherActivity, para mostrar caixa de diálogo de pesquisa e entregar pesquisas para SearchableActivity, declare no manifesto de que SearchableActivity é a atividade de pesquisa; para usar na caixa de pesquisa em OtherActivity.

Para declarar a atividade de pesquisa para uma caixa de diálogo de pesquisa de uma atividade, adicione um <meta-data> no elemento da respectiva atividade <activity>. O <meta-data> deve incluir o atributo android:value que especifica o nome da classe da atividade pesquisável e o atributo android:name com um valor de "android.app.default_searchable".

Por exemplo, esta é a declaração para uma atividade pesquisável, SearchableActivity e outra atividade, OtherActivity, que usa SearchableActivity para realiza pesquisas executadas a partir da caixa de pesquisa:

<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>

Como OtherActivity agora inclui um Elemento <meta-data> para declarar qual atividade de pesquisa será usar para pesquisas, a atividade ativa a caixa de diálogo de pesquisa. Embora o usuário seja nesta atividade, o método onSearchRequested() ativa caixa de diálogo de pesquisa. Quando o usuário executa a pesquisa, o sistema inicia SearchableActivity e entrega o ACTION_SEARCH intenção.

Se você quiser que todas as atividades do app ofereçam a caixa de pesquisa, insira o elemento <meta-data> anterior como filho do <application> em vez de cada <activity>. Dessa forma, todas as atividades herda o valor, fornece a caixa de diálogo de pesquisa e envia as pesquisas para o mesma atividade de pesquisa. Se você tem várias atividades pesquisáveis, é possível substituir a atividade de pesquisa padrão, posicionando uma <meta-data> em atividades individuais.

Com a caixa de pesquisa ativada para suas atividades, o app está pronto para realizar pesquisas.

Invocar a caixa de diálogo de pesquisa

Embora alguns dispositivos forneçam um botão de pesquisa dedicado, o comportamento da pode variar entre dispositivos, e muitos dispositivos não fornecem uma pesquisa sequer. Portanto, ao usar a caixa de diálogo de pesquisa, forneça um botão de pesquisa na IU que ativa a caixa de pesquisa chamando onSearchRequested():

Por exemplo, adicione um botão de pesquisa menu de opções ou layout da interface que chama onSearchRequested().

Você também pode ativar o recurso "digitar para pesquisar" que ativa a funcionalidade de caixa de diálogo de pesquisa quando o usuário começa a digitar no teclado. As teclas são inserido na caixa de diálogo de pesquisa. Você pode ativar a digitação por pesquisa em sua atividade chamando setDefaultKeyMode — ou DEFAULT_KEYS_SEARCH_LOCAL – durante das suas atividades onCreate() .

Impacto da caixa de pesquisa no ciclo de vida da atividade

A caixa de pesquisa é uma Dialog que flutua na parte superior da tela. Como ele não causa mudanças na pilha de atividades, quando a caixa de diálogo de pesquisa é exibida, não há métodos de ciclo de vida, como onPause()—são chamou. Sua atividade perde o foco de entrada, porque o foco de entrada é dado ao caixa de diálogo de pesquisa.

Se você quiser receber uma notificação quando a caixa de diálogo de pesquisa for ativada, modifique a onSearchRequested(). Quando o sistema chama esse método, ele é uma indicação de que sua atividade perde o foco de entrada para a caixa de diálogo de pesquisa, então faça o que for adequado para o evento, como pausar um jogo. A menos que você está transmitindo contexto de pesquisa dados, discutidos em outra seção deste documento, finalizem o chamando a implementação da superclasse:

Kotlin

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

Java

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

Se o usuário cancelar a pesquisa tocando no botão "Voltar", a caixa de diálogo de pesquisa é fechado e a atividade recupera o foco de entrada. Você pode se registrar para receber notificações quando a caixa de diálogo de pesquisa é fechada setOnDismissListener(), setOnCancelListener(), ou ambos. Você só precisa registrar OnDismissListener, porque é chamado sempre que a caixa de pesquisa é fechada. A OnCancelListener só se refere a eventos nos quais o usuário sai explicitamente da caixa de diálogo de pesquisa. Portanto, ele não é chamado quando uma pesquisa é executada. Quando a pesquisa é executada, o a caixa de pesquisa desaparece automaticamente.

Se a atividade atual não for a atividade de pesquisa, a atividade normal eventos de ciclo de vida da atividade são acionados quando o usuário executa pesquisa: a atividade atual recebe onPause(), conforme descrito em Introdução à atividades. No entanto, se a atividade atual for a atividade de pesquisa, uma destas duas situações acontece:

  • Por padrão, a atividade de pesquisa recebe o ACTION_SEARCH com uma chamada para onCreate(), e uma nova instância da atividade é levada para a parte superior da atividade pilha. Há agora duas instâncias da sua atividade de pesquisa na pilha de atividades. Tocar no botão "Voltar" leva você de volta para a pilha de atividades instância da atividade de pesquisa, em vez de sair do campo atividades.
  • Se você definir android:launchMode como "singleTop", a atividade de pesquisa recebe a intent ACTION_SEARCH com uma chamada para onNewIntent(Intent), transmitindo a nova intent ACTION_SEARCH. Por exemplo, veja como você pode lidar com esse caso, em que o modo de inicialização da atividade de pesquisa é "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);
        }
    }
    

    Em comparação com o código de exemplo na seção sobre realizar uma pesquisa, todo o código para lidar com intenção de pesquisa agora está no método handleIntent(), de modo que ambos onCreate() e onNewIntent() podem executá-la.

    Quando o sistema chama onNewIntent(Intent), a atividade não é reiniciada a partir de agora. getIntent() retorna a mesma intent recebida com onCreate(). É por isso que você deve chamar setIntent(Intent) dentro de onNewIntent(Intent): para que a intent salva pelo a atividade será atualizada caso você chame getIntent() no futuro.

O segundo cenário, usando o modo de inicialização "singleTop", geralmente é porque, depois que uma pesquisa é feita, o usuário pode realizar pesquisas e não quiser que o aplicativo crie várias instâncias do atividade de pesquisa. Recomendamos que você defina sua atividade de pesquisa como Modo de inicialização do "singleTop" no manifesto do app, conforme mostrado no exemplo a seguir:

<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>

Transmitir dados de contexto de pesquisa

Em alguns casos, você pode fazer os refinamentos necessários na consulta de pesquisa dentro a atividade de pesquisa para cada pesquisa feita. No entanto, se você quiser refinar seus critérios de pesquisa com base na atividade em que o usuário está realizando uma é possível fornecer dados adicionais na intent que o sistema envia para sua atividade de pesquisa. Você pode transmitir os dados adicionais no APP_DATA Bundle, que é incluído na intent ACTION_SEARCH.

Para passar esse tipo de dados à sua atividade de pesquisa, substitua a propriedade Método onSearchRequested() para a atividade em que o usuário pode realizar uma pesquisa, criar um Bundle com os dados adicionais e ligar startSearch() para ativar a caixa de pesquisa. Exemplo:

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;
 }

Retornar verdadeiro indica que você manipula esse evento de retorno de chamada e chame startSearch() para ativar a caixa de pesquisa. Depois que o usuário envia uma consulta, ela é entregue à sua atividade de pesquisa junto com os dados adicionar. É possível extrair os dados extras do APP_DATA Bundle para refinar a pesquisa, conforme mostrado no exemplo a seguir:

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);
}

Usar o widget de pesquisa

Uma imagem mostrando uma visualização de pesquisa na barra superior de apps

Figura 1. O widget SearchViewcomo uma visualização de ação na barra de apps.

O widget oferece a mesma funcionalidade que a caixa de pesquisa. Ela inicia a atividade adequada quando o usuário executa uma pesquisa e pode fornecer sugestões de pesquisa e realizar pesquisa por voz. Se não for uma opção colocar o widget de pesquisa na barra de apps, você pode colocar o widget em algum lugar no layout da atividade.

Configurar o widget de pesquisa

Depois de criar um configuração de pesquisa e uma atividade pesquisável, ativar a pesquisa assistida para cada SearchView chamando setSearchableInfo() e passando o objeto SearchableInfo que representa sua configuração pesquisável.

Para ter uma referência ao SearchableInfo, chame getSearchableInfo() ativado SearchManager

Por exemplo, se você estiver usando uma SearchView como uma visualização de ação em a barra de aplicativos, ative o widget durante a onCreateOptionsMenu() do Cloud Storage, conforme mostrado no exemplo a seguir:

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;
}

O widget de pesquisa está configurado, e o sistema exibe as consultas de pesquisa à sua atividade de pesquisa. Também é possível ativar sugestões de pesquisa para o widget de pesquisa.

Para mais informações sobre as visualizações de ações na barra de apps, consulte Usar visualizações e ações de ação provedores.

Outros recursos do widget de pesquisa

O widget SearchView fornece alguns recursos adicionais que você você pode querer:

Um botão de envio
Por padrão, não há um botão para enviar uma consulta de pesquisa. Por isso, o usuário precisa pressione a tecla Enter no teclado para iniciar uma pesquisa. Você é possível adicionar um "envio" chamando setSubmitButtonEnabled(true):
Refinamento de consulta para sugestões de pesquisa
Quando você ativa as sugestões de pesquisa, normalmente espera-se que os usuários selecionem um mas também pode querer refinar a consulta de pesquisa sugerida. Você pode adicionar um botão ao lado de cada sugestão que a insere na caixa de pesquisa para que o usuário possa refinar a pesquisa, chamando setQueryRefinementEnabled(true):
A capacidade de alternar a visibilidade da caixa de pesquisa
Por padrão, o widget de pesquisa é "iconificado", o que significa que é representada apenas por um ícone de pesquisa, uma lupa. Ele se expande para mostrar a caixa de pesquisa quando o usuário tocar no ícone. Conforme mostrado no Por exemplo, é possível mostrar a caixa de pesquisa por padrão chamando setIconifiedByDefault(false): Também é possível alternar a aparência do widget de pesquisa chamando setIconified():

Há várias outras APIs na classe SearchView que permitem a personalizar o widget de pesquisa. No entanto, a maioria delas é usada apenas quando você lide com todas as entradas do usuário por conta própria, em vez de usar o sistema Android para entregar consultas de pesquisa e sugestões de pesquisa.

Usar o widget e a caixa de diálogo

Se você inserir o widget de pesquisa na barra de apps como um visualização de ação e ativar que ele apareça na barra de apps se houver espaço, definindo android:showAsAction="ifRoom", o widget de pesquisa poderá não aparecem como uma visualização de ação. Em vez disso, um item de menu pode aparecer no menu flutuante . Por exemplo, quando seu app for executado em uma tela menor, pode não haver espaço suficiente na barra de apps para exibir o widget da Pesquisa com outras ações ou elementos de navegação, para que o item de menu apareça no menu flutuante . Quando colocado no menu flutuante, o item funciona como um menu comum e não exibe a visualização de ação, ou seja, o widget de pesquisa.

Para lidar com essa situação, o item de menu ao qual você anexa o widget de pesquisa precisa ativar a caixa de diálogo de pesquisa quando o usuário a selecionar no menu flutuante. Para que isso aconteça, implemente onOptionsItemSelected() para gerenciar a "Pesquisa" e abrir a caixa de diálogo de pesquisa chamando onSearchRequested().

Para mais informações sobre como os itens na barra de apps funcionam e como lidar com eles essa situação, consulte Adicionar a barra de apps.

Adicionar pesquisa por voz

Para adicionar a funcionalidade de pesquisa por voz à caixa ou ao widget de pesquisa, faça o seguinte: adicionando o atributo android:voiceSearchMode à sua campanha configuração do Terraform. Isso adiciona um botão de pesquisa por voz que inicia uma solicitação por voz. Quando o usuário termina de falar, a consulta de pesquisa transcrita é enviada para o seu atividade de pesquisa.

Isso é mostrado neste exemplo:

<?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>

O valor showVoiceSearchButton é necessário para ativar a voz pesquisa. O segundo valor, launchRecognizer, especifica que o botão de pesquisa por voz precisa iniciar um reconhecedor que retorne o texto transcrito para a atividade pesquisável.

Você pode fornecer atributos adicionais para especificar o comportamento da pesquisa por voz, como o idioma esperado e o número máximo de resultados a serem retornados. Consulte a referência de Configuração de pesquisa para mais informações sobre os atributos disponíveis.

.

Adicionar sugestões de pesquisa

Tanto a caixa quanto o widget de pesquisa podem fornecer sugestões de pesquisa conforme o usuário digita, com a ajuda do sistema Android. O sistema gerencia a lista de sugestões e processa o evento quando o usuário seleciona sugestão.

Você pode fornecer dois tipos de sugestões de pesquisa:

Sugestões de pesquisa de consulta recentes
Essas sugestões são palavras que o usuário usou anteriormente como pesquisa consultas em seu aplicativo. Consulte Adicionar sugestões de pesquisa personalizadas para mais informações.
Sugestões de pesquisa personalizadas
São sugestões de pesquisa que você fornece da sua própria fonte de dados para ajudam os usuários a selecionar imediatamente a ortografia ou o item correto que estão pesquisando pelas quais Consulte Adicionar pesquisa personalizada sugestões para mais informações.