Benutzerdefinierte Suchvorschläge hinzufügen

Sie können im Android-Suchdialogfeld Suchvorschläge basierend auf den letzten Suchanfragen angeben oder Such-Widget. Wenn ein Nutzer z. B. nach „Welpen“ sucht, wird die Abfrage als Vorschlag angezeigt, geben Sie dieselbe Abfrage erneut ein. Abbildung 1 zeigt ein Beispiel für ein Suchdialogfeld mit kürzlich erfolgter Abfrage. Vorschläge machen.

Bevor Sie beginnen, sollten Sie das Suchdialogfeld oder ein Such-Widget für einfache Suchanfragen implementieren in Ihrer Anwendung. Weitere Informationen dazu finden Sie unter Erstellen Sie eine Suchoberfläche.

Grundlagen

Abbildung 1: Screenshot eines Suchdialogfelds mit aktueller Abfrage Vorschläge machen.

Letzte Suchanfragenvorschläge sind gespeicherte Suchanfragen. Wenn der Nutzer einen Vorschlag auswählt, werden Ihre durchsuchbaren Aktivität erhält ein ACTION_SEARCH Intent , wobei der Vorschlag als Suchanfrage verwendet wird, die von Ihrer durchsuchbaren Aktivität bereits verarbeitet wird.

So erhalten Sie Vorschläge für aktuelle Abfragen:

  • Implementieren Sie eine suchbare Aktivität.
  • Contentanbieter erstellen, der SearchRecentSuggestionsProvider und in deinem App-Manifest deklarieren.
  • Die durchsuchbare Konfiguration mit Informationen zum Contentanbieter ändern, der diese bereitstellt Suchvorschlägen angezeigt.
  • Speichern Sie Anfragen bei Ihrem Contentanbieter, wenn eine Suche ausgeführt wird.

Genau wie das Android-System das Suchdialogfeld anzeigt, werden unten die Suchvorschläge angezeigt. das Dialogfeld oder das Such-Widget. Sie geben die Quelle an, aus der das System die Vorschläge abruft.

Wenn das System erkennt, dass Ihre Aktivität durchsuchbar ist, und Vorschläge für die Suche macht, wird das wenn der Nutzer eine Abfrage eingibt:

  1. Das System nimmt den Text der Suchanfrage – was immer der Nutzer mit der Eingabe beginnt –, und eine Anfrage an den Contentanbieter, der Ihre Vorschläge enthält.
  2. Ihr Contentanbieter gibt eine Cursor, die auf alle verweisen Vorschläge, die dem Text der Suchanfrage entsprechen.
  3. Das System zeigt die Liste der von Cursor bereitgestellten Vorschläge an.

Sobald die letzten Vorschläge für Suchanfragen angezeigt werden, kann Folgendes geschehen:

  • Gibt der Nutzer einen anderen Schlüssel ein oder ändert die Abfrage in irgendeiner Weise, sind die vorherigen Schritte und die Liste mit Vorschlägen wird aktualisiert.
  • Wenn der Nutzer die Suche ausführt, werden die Vorschläge ignoriert und die Suche wird an mit dem normalen ACTION_SEARCH-Intent zu Ihrer durchsuchbaren Aktivität.
  • Wenn der Nutzer einen Vorschlag auswählt, wird ein ACTION_SEARCH-Intent an Ihr die durchsuchte Aktivität unter Verwendung des vorgeschlagenen Textes als Abfrage.

Die SearchRecentSuggestionsProvider-Klasse, die Sie für Ihren Contentanbieter erweitern erledigt die Arbeit aus den vorherigen Schritten automatisch, sodass Sie nur wenig Code schreiben müssen.

Contentanbieter erstellen

Der Contentanbieter, den Sie für aktuelle Suchanfragenvorschläge benötigen, ist eine Implementierung von SearchRecentSuggestionsProvider Dieser Kurs erledigt alles für Sie. Sie müssen nur Schreiben Sie einen Klassenkonstruktor, der eine Codezeile ausführt.

Hier sehen Sie als Beispiel eine vollständige Implementierung eines Contentanbieters für eine kürzlich durchgeführte Suchanfrage, Vorschläge:

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

Der Aufruf an setupSuggestions() übergibt den Namen der Suchbehörde und einen Datenbankmodus. Die Suchbehörde kann eine beliebige Die Best Practice besteht jedoch darin, einen voll qualifizierten Namen für Ihren Contentanbieter zu verwenden, z. B. den Paketnamen, gefolgt vom Klassennamen des Anbieters. Beispiel: "com.example.MySuggestionProvider"

Der Datenbankmodus muss DATABASE_MODE_QUERIES und kann optional DATABASE_MODE_2LINES, Dadurch wird der Tabelle mit Vorschlägen eine Spalte hinzugefügt, sodass Sie jeweils eine zweite Textzeile hinzufügen können. Vorschlag. Im folgenden Beispiel sehen Sie, wie jeder Vorschlag zwei Zeilen enthalten soll:

Kotlin

const val MODE: Int = DATABASE_MODE_QUERIES or DATABASE_MODE_2LINES

Java

public final static int MODE = DATABASE_MODE_QUERIES | DATABASE_MODE_2LINES;

Deklariere den Contentanbieter im Manifest deiner App mit demselben Autorisierungsstring wie in Ihre SearchRecentSuggestionsProvider-Klasse und in der Konfiguration für die Suche. Für Beispiel:

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

Konfiguration durchsuchbar ändern

Um das System für die Verwendung des Anbieters für Vorschläge zu konfigurieren, fügen Sie den android:searchSuggestAuthority und android:searchSuggestSelection <searchable>-Element in Ihrer durchsuchbaren Konfigurationsdatei hinzu. Für Beispiel:

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

Bei dem Wert für android:searchSuggestAuthority muss es sich um einen voll qualifizierten Namen für Ihr Contentanbieter, der genau mit der vom Contentanbieter verwendeten Autorität übereinstimmt, z. B. "com.example.MySuggestionProvider".

Dem Wert für android:searchSuggestSelection muss ein einzelnes Fragezeichen vorangestellt werden durch einen Gruppenbereich: " ?". Dies ist ein Platzhalter für das SQLite-Auswahlargument. automatisch durch den vom Nutzer eingegebenen Text ersetzt.

Abfragen speichern

Um Ihre Sammlung der letzten Suchanfragen zu füllen, fügen Sie jede Suchanfrage hinzu, die über Ihre suchbare Aktivitäten in SearchRecentSuggestionsProvider übertragen. Erstellen Sie dazu eine Instanz von SearchRecentSuggestions und rufen Sie saveRecentQuery() jedes Mal, wenn Ihre durchsuchbare Aktivität eine Suchanfrage erhält. So können Sie beispielsweise die Abfrage während der 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);
    }
}

Der SearchRecentSuggestionsProvider-Konstruktor erfordert die und Datenbankmodus, der von Ihrem Contentanbieter angegeben wurde.

Die Methode saveRecentQuery() verwendet den Suchabfragestring als ersten Parameter und optional eine zweite Zeichenfolge, die als zweite Zeile des Vorschlags oder null eingefügt werden soll. Die zweite wird nur verwendet, wenn Sie den zweizeiligen Modus für die Suchvorschläge mit DATABASE_MODE_2LINES Wenn Sie den zweizeiligen Modus aktivieren, wird der Abfragetext mit in die zweite Zeile, wenn das System nach passenden Vorschlägen sucht.

Daten zu Vorschlägen löschen

Aus Datenschutzgründen solltest du dem Nutzer immer eine Möglichkeit bieten, die letzte Anfrage zu löschen Vorschläge machen. Um den Abfrageverlauf zu löschen, rufen Sie clearHistory() Beispiel:

Kotlin

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

Java

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

Führen Sie dies über die Option „Suchverlauf löschen“ aus. Menüelement, Einstellungselement oder eine Schaltfläche. Gib ein Bestätigungsdialogfeld an, in dem bestätigt wird, dass der Nutzer seinen Suchverlauf löschen möchte.