Vous pouvez proposer des suggestions de recherche basées sur vos requêtes de recherche récentes dans la boîte de dialogue de recherche Android ou widget Recherche. Par exemple, si un utilisateur interroge "chiots", la requête apparaît comme suggestion saisissez à nouveau la même requête. La figure 1 montre un exemple de boîte de dialogue de recherche avec une requête récente. des suggestions.
Avant de commencer, implémentez la boîte de dialogue de recherche ou un widget Recherche pour les recherches de base dans votre application. Pour savoir comment procéder, consultez Créez une interface de recherche.
Principes de base
![](https://developer.android.com/static/images/search/search-suggest-recent-queries.png?authuser=9&hl=fr)
Figure 1 : Capture d'écran d'une boîte de dialogue de recherche avec une requête récente des suggestions.
Les suggestions de requêtes récentes correspondent aux recherches enregistrées. Lorsque l'utilisateur sélectionne une suggestion, votre moteur de recherche
d'activité reçoit une
ACTION_SEARCH
intent
avec la suggestion comme requête de recherche déjà gérée par votre activité de recherche.
Pour fournir des suggestions de requêtes récentes, procédez comme suit:
- Implémentez une activité avec recherche.
- Créez un fournisseur de contenu qui étend
SearchRecentSuggestionsProvider
et déclarez-le dans le fichier manifeste de votre application. - Modifiez la configuration interrogeable à l'aide d'informations sur le fournisseur de contenu qui fournit suggestions de recherche.
- Enregistrez les requêtes dans votre fournisseur de contenu chaque fois qu'une recherche est exécutée.
Tout comme le système Android affiche la boîte de dialogue de recherche, il affiche les suggestions de recherche ci-dessous. la boîte de dialogue ou le widget de recherche. Vous indiquez la source à partir de laquelle le système récupère les suggestions.
Lorsque le système détermine que votre activité peut faire l'objet de recherches et fournit des suggestions de recherche, le ce qui se produit lorsque l'utilisateur saisit une requête:
- Le système récupère le texte de la requête de recherche (ce que l'utilisateur commence à saisir) et envoie une requête au fournisseur de contenu qui contient vos suggestions.
- Votre fournisseur de contenu renvoie un
Cursor
qui pointe vers tous qui correspondent au texte de la requête de recherche. - Le système affiche la liste des suggestions fournies par
Cursor
.
Une fois les suggestions de requêtes récentes affichées, voici ce qui peut se produire:
- Si l'utilisateur saisit une autre clé ou modifie la requête d'une quelconque façon, les étapes précédentes sont répété et la liste de suggestions est mise à jour.
- Si l'utilisateur effectue la recherche, les suggestions sont ignorées et la recherche est envoyée à
votre activité de recherche à l'aide de l'intent
ACTION_SEARCH
normal ; - Si l'utilisateur sélectionne une suggestion, un intent
ACTION_SEARCH
est transmis à votre activité de recherche en utilisant le texte suggéré comme requête.
La classe SearchRecentSuggestionsProvider
que vous étendez pour votre fournisseur de contenu
effectue automatiquement le travail des étapes précédentes, il y a donc peu de code à écrire.
Créer un fournisseur de contenu
Le fournisseur de contenu dont vous avez besoin pour les suggestions de requêtes récentes est une implémentation de
SearchRecentSuggestionsProvider
Ce cours se charge de tout pour vous. Il vous suffit de
écrire un constructeur de classe qui
exécute une ligne de code.
Par exemple, voici une implémentation complète d'un fournisseur de contenu pour une requête récente suggestions:
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); } }
L'appel à
setupSuggestions()
transmet le nom de l'autorité de recherche
et un mode de base de données. L'autorité de recherche peut être n'importe quel nom unique
mais la meilleure pratique consiste à utiliser un nom complet pour votre fournisseur de contenu, tel que
le nom du package suivi du nom de classe du fournisseur. Par exemple, "com.example.MySuggestionProvider"
.
Le mode de base de données doit inclure
DATABASE_MODE_QUERIES
et peuvent éventuellement inclure
DATABASE_MODE_2LINES
,
qui ajoute une colonne au tableau des suggestions afin que vous puissiez fournir une deuxième ligne de texte pour chaque
suggestion. Si vous souhaitez fournir deux lignes dans chaque suggestion, consultez l'exemple suivant:
Kotlin
const val MODE: Int = DATABASE_MODE_QUERIES or DATABASE_MODE_2LINES
Java
public final static int MODE = DATABASE_MODE_QUERIES | DATABASE_MODE_2LINES;
Déclarez le fournisseur de contenu dans le fichier manifeste de votre application avec la même chaîne d'autorité que celle utilisée dans
votre classe SearchRecentSuggestionsProvider
et dans la configuration incluse dans l'index de recherche. Exemple :
<application> <provider android:name=".MySuggestionProvider" android:authorities="com.example.MySuggestionProvider" /> ... </application>
Modifier la configuration incluse dans l'index de recherche
Pour configurer le système afin qu'il utilise votre fournisseur de suggestions, ajoutez le paramètre
android:searchSuggestAuthority
et android:searchSuggestSelection
à l'élément <searchable>
dans votre fichier de configuration inclus dans l'index de recherche. Exemple :
<?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>
La valeur de android:searchSuggestAuthority
doit être un nom complet pour votre
fournisseur de contenu correspondant exactement à l'autorité utilisée par le fournisseur de contenu, par exemple
"com.example.MySuggestionProvider"
dans les exemples précédents.
La valeur de android:searchSuggestSelection
doit être précédée d'un seul point d'interrogation
par un espace: " ?"
. Il s'agit d'un espace réservé pour l'argument de sélection SQLite.
automatiquement remplacé par le texte
de la requête saisi par l'utilisateur.
Enregistrer les requêtes
Pour remplir votre collection de requêtes récentes, ajoutez chaque requête reçue par votre moteur de recherche.
activité à votre SearchRecentSuggestionsProvider
. Pour ce faire, créez une instance de
SearchRecentSuggestions
et appelez
saveRecentQuery()
chaque fois que votre activité de recherche reçoit une requête. Par exemple, voici comment enregistrer la requête
pendant l’activité
onCreate()
méthode:
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); } }
Le constructeur SearchRecentSuggestionsProvider
nécessite
même autorité et mode de base de données déclarés par votre fournisseur de contenu.
La méthode saveRecentQuery()
utilise la chaîne de requête de recherche comme premier paramètre.
et, éventuellement, une seconde chaîne à inclure comme deuxième ligne de la suggestion ou une valeur nulle. Le deuxième
n'est utilisé que si vous activez le mode sur deux lignes pour les suggestions de recherche avec
DATABASE_MODE_2LINES
Si vous activez le mode sur deux lignes, le texte de la requête est mis en correspondance
à la deuxième ligne lorsque le système
recherche des suggestions correspondantes.
Effacer les données des suggestions
Pour protéger la confidentialité des données de l'utilisateur, offrez-lui toujours un moyen d'effacer la requête récente
des suggestions. Pour effacer l'historique des requêtes, appelez
clearHistory()
Exemple :
Kotlin
SearchRecentSuggestions(this, HelloSuggestionsProvider.AUTHORITY, HelloSuggestionsProvider.MODE) .clearHistory()
Java
SearchRecentSuggestions suggestions = new SearchRecentSuggestions(this, HelloSuggestionProvider.AUTHORITY, HelloSuggestionProvider.MODE); suggestions.clearHistory();
Exécutez cette opération à partir de l'option "Effacer l'historique des recherches" que vous avez sélectionnée. un élément de menu, un élément de préférence ou un bouton. Fournir une boîte de dialogue de confirmation pour vérifier que l'utilisateur souhaite supprimer son historique des recherches