Ajouter des suggestions de recherche personnalisées

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

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:

  1. 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.
  2. Votre fournisseur de contenu renvoie un Cursor qui pointe vers tous qui correspondent au texte de la requête de recherche.
  3. 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