Aggiungi suggerimenti di ricerca personalizzati

Puoi fornire suggerimenti di ricerca basati sulle query di ricerca recenti nella finestra di dialogo di ricerca di Android oppure widget Ricerca. Ad esempio, se un utente esegue una query su "cuccioli", la query viene visualizzata come suggerimento ridigita la stessa query. La figura 1 mostra un esempio di finestra di dialogo di ricerca con una query recente suggerimenti.

Prima di iniziare, implementa la finestra di dialogo di ricerca o un widget di ricerca per le ricerche di base nella tua applicazione. Per scoprire come fare, vedi Crea un'interfaccia di ricerca.

Nozioni di base

Figura 1. Screenshot di una finestra di dialogo di ricerca con query recente suggerimenti.

I suggerimenti di query recenti sono ricerche salvate. Quando l'utente seleziona un suggerimento, gli annunci vengono un'attività riceve un ACTION_SEARCH intent con il suggerimento come query di ricerca già gestita dalla tua attività di ricerca.

Per fornire suggerimenti sulle query recenti, devi:

  • Implementare un'attività di ricerca.
  • Creare un fornitore di contenuti che si espanda SearchRecentSuggestionsProvider e dichiararlo nel file manifest dell'applicazione.
  • Modifica la configurazione disponibile per la ricerca con informazioni sul fornitore di contenuti che fornisce suggerimenti di ricerca.
  • Salva le query nel fornitore di contenuti ogni volta che viene eseguita una ricerca.

Così come il sistema Android mostra la finestra di dialogo di ricerca, vengono visualizzati i suggerimenti di ricerca riportati di seguito. alla finestra di dialogo o al widget di ricerca. Tu fornisci l'origine da cui il sistema recupera i suggerimenti.

Quando il sistema rileva che la tua attività è disponibile per la ricerca e fornisce suggerimenti di ricerca, la si verifica quanto segue quando l'utente digita una query:

  1. Il sistema utilizza il testo della query di ricerca, qualunque cosa l'utente inizi a digitare, e esegue una query al fornitore di contenuti che contiene i tuoi suggerimenti.
  2. Il tuo fornitore di contenuti restituisce un Cursor che punta a tutti suggerimenti che corrispondono al testo della query di ricerca.
  3. Il sistema mostra l'elenco di suggerimenti forniti da Cursor.

Una volta visualizzati i suggerimenti per le query recenti, potrebbe verificarsi quanto segue:

  • Se l'utente digita un'altra chiave o modifica la query in qualsiasi modo, i passaggi precedenti sono ripetuto e l'elenco di suggerimenti viene aggiornato.
  • Se l'utente esegue la ricerca, i suggerimenti vengono ignorati e la ricerca viene visualizzata la tua attività di ricerca utilizzando il normale intent ACTION_SEARCH.
  • Se l'utente seleziona un suggerimento, viene inviato un intent ACTION_SEARCH al tuo attività di ricerca utilizzando il testo suggerito come query.

La classe SearchRecentSuggestionsProvider che estendi per il tuo fornitore di contenuti esegue automaticamente il lavoro nei passaggi precedenti, quindi c'è poco codice da scrivere.

Crea un fornitore di contenuti

Il fornitore di contenuti di cui hai bisogno per i suggerimenti per le query recenti è un'implementazione SearchRecentSuggestionsProvider. Questo corso fa tutto per te. Devi solo scrivere un costruttore di classe che esegue una riga di codice.

Ad esempio, ecco un'implementazione completa di un fornitore di contenuti per una query recente suggerimenti:

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

La chiamata a setupSuggestions() trasmette il nome dell'autorità di ricerca e una modalità di database. L'autorità di ricerca può essere qualsiasi ma la best practice è quella di utilizzare un nome completo per il fornitore di contenuti, ad esempio il nome del pacchetto seguito dal nome della classe del provider. Ad esempio: "com.example.MySuggestionProvider".

La modalità di database deve includere DATABASE_MODE_QUERIES e può includere o meno DATABASE_MODE_2LINES, che aggiunge una colonna alla tabella dei suggerimenti in modo da poter fornire una seconda riga di testo a ogni suggerimento. Se vuoi inserire due righe in ogni suggerimento, guarda l'esempio seguente:

Kotlin

const val MODE: Int = DATABASE_MODE_QUERIES or DATABASE_MODE_2LINES

Java

public final static int MODE = DATABASE_MODE_QUERIES | DATABASE_MODE_2LINES;

Dichiara il fornitore di contenuti nel file manifest dell'applicazione con la stessa stringa di autorità utilizzata in del corso SearchRecentSuggestionsProvider e nella configurazione disponibile per la ricerca. Per esempio:

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

Modifica la configurazione disponibile per la ricerca

Per configurare il sistema in modo che utilizzi il tuo fornitore di suggerimenti, aggiungi il android:searchSuggestAuthority e android:searchSuggestSelection all'elemento <searchable> del file di configurazione disponibile per la ricerca. Per esempio:

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

Il valore relativo a android:searchSuggestAuthority deve essere un nome completo per del fornitore di contenuti che corrisponde esattamente all'autorità utilizzata nel fornitore di contenuti, ad esempio "com.example.MySuggestionProvider" negli esempi precedenti.

Il valore di android:searchSuggestSelection deve essere un singolo punto interrogativo preceduto da uno spazio: " ?". Questo è un segnaposto per l'argomento di selezione SQLite sostituiti automaticamente dal testo della query inserito dall'utente.

Salvare le query

Per compilare la tua raccolta di query recenti, aggiungi ogni query ricevuta dai tuoi attività su SearchRecentSuggestionsProvider. Per farlo, crea un'istanza SearchRecentSuggestions e chiama saveRecentQuery() ogni volta che l'attività di ricerca riceve una query. Ad esempio, ecco come puoi salvare la query durante la 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);
    }
}

Il costruttore SearchRecentSuggestionsProvider richiede la stessa autorità e modalità di database dichiarate dal tuo fornitore di contenuti.

Il metodo saveRecentQuery() utilizza la stringa della query di ricerca come primo parametro e, facoltativamente, una seconda stringa da includere come seconda riga del suggerimento o un valore nullo. Il secondo viene utilizzato soltanto se si attiva la modalità a due righe per i suggerimenti di ricerca con DATABASE_MODE_2LINES. Se attivi la modalità a due righe, il testo della query viene confrontato con la seconda riga quando il sistema cerca suggerimenti corrispondenti.

Cancella i dati del suggerimento

Per proteggere la privacy dell'utente, fornisci sempre all'utente un modo per cancellare la query recente suggerimenti. Per cancellare la cronologia delle query, richiama clearHistory(). Ad esempio:

Kotlin

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

Java

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

Esegui questa operazione scegliendo l'opzione "Cancella cronologia delle ricerche" voce di menu, voce di preferenza o pulsante. Fornisci una finestra di dialogo di conferma per verificare che l'utente voglia eliminare la propria cronologia delle ricerche.