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
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:
- 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.
- Il tuo fornitore di contenuti restituisce un
Cursor
che punta a tutti suggerimenti che corrispondono al testo della query di ricerca. - 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.