Adicionar sugestões de pesquisa personalizadas

Você pode fornecer sugestões de pesquisa com base em consultas de pesquisa recentes na caixa de diálogo de pesquisa do Android ou widget de pesquisa. Por exemplo, se um usuário consultar "filhotes", a consulta aparece como uma sugestão quando digite a mesma consulta novamente. A Figura 1 mostra um exemplo de uma caixa de diálogo de pesquisa com uma consulta recente sugestões.

Antes de começar, implemente a caixa de diálogo ou um widget de pesquisa para pesquisas básicas no seu aplicativo. Para saber como, consulte Crie uma interface de pesquisa.

Noções básicas

Figura 1. Captura de tela de uma caixa de diálogo de pesquisa com consulta recente sugestões.

As sugestões de consulta recentes são pesquisas salvas. Quando o usuário seleciona uma sugestão, sua pesquisa recebe um ACTION_SEARCH intent com a sugestão como a consulta de pesquisa que sua atividade de pesquisa já processa.

Para fornecer sugestões de consultas recentes, você precisa:

  • Implementar uma atividade de pesquisa.
  • Crie um provedor de conteúdo que estenda SearchRecentSuggestionsProvider e declará-lo no manifesto do aplicativo.
  • Modificar a configuração pesquisável com informações sobre o provedor de conteúdo que fornece sugestões de pesquisa.
  • salvar consultas no seu provedor de conteúdo sempre que uma pesquisa é realizada.

Assim como o sistema Android exibe a caixa de diálogo de pesquisa, ele também exibe as sugestões de pesquisa abaixo na caixa de diálogo ou no widget de pesquisa. Você informa a origem da qual o sistema recupera as sugestões.

Quando o sistema identifica que sua atividade é pesquisável e fornece sugestões de pesquisa, o acontece quando o usuário digita uma consulta:

  1. O sistema recebe o texto da consulta de pesquisa, tudo o que o usuário começa a digitar, e executa uma consulta ao provedor de conteúdo que contém suas sugestões.
  2. Seu provedor de conteúdo retorna um Cursor que aponta para todos sugestões que correspondam ao texto da consulta de pesquisa.
  3. O sistema mostra a lista de sugestões fornecidas pelo Cursor.

Depois que as sugestões de consulta recentes são exibidas, pode ocorrer o seguinte:

  • Se o usuário digitar outra tecla ou alterar a consulta de alguma forma, as etapas anteriores serão repetido e a lista de sugestões é atualizada.
  • Se o usuário executar a pesquisa, as sugestões serão ignoradas e a pesquisa será entregue ao sua atividade de pesquisa usando a intent ACTION_SEARCH normal.
  • Se o usuário selecionar uma sugestão, uma intent ACTION_SEARCH será entregue ao seu atividade de pesquisa usando o texto sugerido como a consulta.

A classe SearchRecentSuggestionsProvider que você estende para seu provedor de conteúdo faz o trabalho automaticamente nas etapas anteriores, então há pouco código a ser programado.

Criar um provedor de conteúdo

O provedor de conteúdo necessário para sugestões de consulta recentes é uma implementação do SearchRecentSuggestionsProvider: Esta classe faz tudo por você. Você só precisa escrever um construtor de classe que execute uma linha de código.

Por exemplo, esta é uma implementação completa de um provedor de conteúdo para uma consulta recente sugestões:

Kotlin

class MySuggestionProvider : SearchRecentSuggestionsProvider() {
    init {
        setupSuggestions(AUTHORITY, MODE)
    }

    companion object {
        const val AUTHORITY = "com.example.MySuggestionProvider"
        const val MODE: Int = SearchRecentSuggestionsProvider.DATABASE_MODE_QUERIES
    }
}

Java

public class MySuggestionProvider extends SearchRecentSuggestionsProvider {
    public final static String AUTHORITY = "com.example.MySuggestionProvider";
    public final static int MODE = DATABASE_MODE_QUERIES;

    public MySuggestionProvider() {
        setupSuggestions(AUTHORITY, MODE);
    }
}

A chamada para setupSuggestions() passa o nome da autoridade de pesquisa e um modo de banco de dados. A autoridade de pesquisa pode ser qualquer string, mas a prática recomendada é usar um nome totalmente qualificado para o provedor de conteúdo, como o nome do pacote seguido pelo nome da classe do provedor. Por exemplo: "com.example.MySuggestionProvider".

O modo de banco de dados deve incluir DATABASE_MODE_QUERIES e, opcionalmente, pode incluir DATABASE_MODE_2LINES, que adiciona uma coluna à tabela de sugestões para que você possa fornecer uma segunda linha de texto com cada sugestão. Se você quiser fornecer duas linhas em cada sugestão, consulte o exemplo a seguir:

Kotlin

const val MODE: Int = DATABASE_MODE_QUERIES or DATABASE_MODE_2LINES

Java

public final static int MODE = DATABASE_MODE_QUERIES | DATABASE_MODE_2LINES;

Declare o provedor de conteúdo no manifesto do aplicativo com a mesma string de autoridade usada no na classe SearchRecentSuggestionsProvider e na configuração pesquisável. Por exemplo:

<application>
    <provider android:name=".MySuggestionProvider"
              android:authorities="com.example.MySuggestionProvider" />
    ...
</application>

Modificar a configuração pesquisável

Para configurar o sistema para usar seu provedor de sugestões, adicione o android:searchSuggestAuthority e android:searchSuggestSelection atributos ao elemento <searchable> no seu arquivo de configuração pesquisável. Por exemplo:

<?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"
    android:searchSuggestAuthority="com.example.MySuggestionProvider"
    android:searchSuggestSelection=" ?" >
</searchable>

O valor de android:searchSuggestAuthority precisa ser um nome totalmente qualificado para sua provedor de conteúdo que corresponda exatamente à autoridade usada no provedor de conteúdo, como "com.example.MySuggestionProvider" nos exemplos anteriores.

O valor para android:searchSuggestSelection precisa ser um único ponto de interrogação precedido por um espaço: " ?". Esse é um marcador de posição para o argumento de seleção do SQLite e é substituído automaticamente pelo texto da consulta inserido pelo usuário.

Salvar consultas

Para preencher sua coleção de consultas recentes, adicione cada consulta recebida pelo seu atividade ao SearchRecentSuggestionsProvider. Para isso, crie uma instância do SearchRecentSuggestions e chame saveRecentQuery() sempre que sua atividade de pesquisa receber uma consulta. Por exemplo, veja como salvar a consulta durante o período onCreate() :

Kotlin

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

    if (Intent.ACTION_SEARCH == intent.action) {
        intent.getStringExtra(SearchManager.QUERY)?.also { query ->
            SearchRecentSuggestions(this, MySuggestionProvider.AUTHORITY, MySuggestionProvider.MODE)
                    .saveRecentQuery(query, null)
        }
    }
}

Java

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

    Intent intent  = getIntent();

    if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
        String query = intent.getStringExtra(SearchManager.QUERY);
        SearchRecentSuggestions suggestions = new SearchRecentSuggestions(this,
                MySuggestionProvider.AUTHORITY, MySuggestionProvider.MODE);
        suggestions.saveRecentQuery(query, null);
    }
}

O construtor SearchRecentSuggestionsProvider requer a mesma autoridade e modo de banco de dados declarados pelo provedor de conteúdo.

O método saveRecentQuery() usa a string de consulta de pesquisa como o primeiro parâmetro e, opcionalmente, uma segunda string para incluir como a segunda linha da sugestão ou nulo. A segunda será usado apenas se você ativar o modo de duas linhas para as sugestões de pesquisa com DATABASE_MODE_2LINES: Se você ativar o modo de duas linhas, o texto da consulta corresponderá na segunda linha, quando o sistema procura sugestões correspondentes.

Limpar os dados da sugestão

Para proteger a privacidade do usuário, sempre forneça uma maneira de limpar a consulta recente sugestões. Para limpar o histórico de consultas, chame clearHistory(): Exemplo:

Kotlin

SearchRecentSuggestions(this, HelloSuggestionsProvider.AUTHORITY, HelloSuggestionsProvider.MODE)
        .clearHistory()

Java

SearchRecentSuggestions suggestions = new SearchRecentSuggestions(this,
        HelloSuggestionProvider.AUTHORITY, HelloSuggestionProvider.MODE);
suggestions.clearHistory();

Execute-o a partir da sua escolha de "Limpar histórico de pesquisa" item de menu, item de preferência ou botão. Forneça uma caixa de diálogo de confirmação para verificar se o usuário quer excluir o histórico de pesquisa.