Benutzerdefinierte Suchvorschläge hinzufügen

Jetpack Compose verwenden
Jetpack Compose ist das empfohlene UI-Toolkit für Android. Informationen zum Hinzufügen einer Suchfunktion in Compose

Sie können Suchvorschläge basierend auf den letzten Suchanfragen im Android-Suchdialog oder im Such-Widget bereitstellen. Wenn ein Nutzer beispielsweise nach „Welpen“ sucht, wird die Abfrage als Vorschlag angezeigt, wenn er sie noch einmal eingibt. Abbildung 1 zeigt ein Beispiel für einen Suchdialog mit Vorschlägen für aktuelle Suchanfragen.

Implementieren Sie zuerst den Suchdialog oder ein Such-Widget für einfache Suchvorgänge in Ihrer Anwendung. Weitere Informationen finden Sie unter Suchoberfläche erstellen.

Grundlagen

Abbildung 1 : Screenshot eines Suchdialogs mit Vorschlägen für aktuelle Suchanfragen

Vorschläge für aktuelle Suchanfragen sind gespeicherte Suchanfragen. Wenn der Nutzer einen Vorschlag auswählt, erhält Ihre durchsuchbare Aktivität einen ACTION_SEARCH-Intent mit dem Vorschlag als Suchanfrage, die Ihre durchsuchbare Aktivität bereits verarbeitet.

So stellen Sie Vorschläge für aktuelle Suchanfragen bereit:

  • Implementieren Sie eine durchsuchbare Aktivität.
  • Erstellen Sie einen Contentanbieter, der SearchRecentSuggestionsProvider erweitert, und deklarieren Sie ihn im Anwendungsmanifest.
  • Ändern Sie die durchsuchbare Konfiguration mit Informationen zum Contentanbieter, der Suchvorschläge bereitstellt.
  • Speichern Sie bei jeder Suche Abfragen in Ihrem Contentanbieter.

So wie das Android-System den Suchdialog anzeigt, werden auch die Suchvorschläge unter dem Dialog oder dem Such-Widget angezeigt. Sie geben die Quelle an, aus der das System die Vorschläge abruft.

Wenn das System feststellt, dass Ihre Aktivität durchsuchbar ist und Suchvorschläge bereitstellt, passiert Folgendes, wenn der Nutzer eine Abfrage eingibt:

  1. Das System verwendet den Text der Suchanfrage – alles, was der Nutzer eingibt – und führt eine Abfrage für den Contentanbieter aus, der Ihre Vorschläge enthält.
  2. Ihr Contentanbieter gibt einen Cursor zurück, der auf alle Vorschläge verweist, die mit dem Text der Suchanfrage übereinstimmen.
  3. Das System zeigt die Liste der Vorschläge an, die vom Cursor bereitgestellt werden.

Sobald die Vorschläge für aktuelle Suchanfragen angezeigt werden, kann Folgendes passieren:

  • Wenn der Nutzer eine andere Taste drückt oder die Abfrage auf irgendeine Weise ändert, werden die vorherigen Schritte werden wiederholt und die Vorschlagsliste wird aktualisiert.
  • Wenn der Nutzer die Suche ausführt, werden die Vorschläge ignoriert und die Suche wird an Ihre durchsuchbare Aktivität mit dem normalen ACTION_SEARCH Intent gesendet.
  • Wenn der Nutzer einen Vorschlag auswählt, wird ein ACTION_SEARCH Intent mit dem vorgeschlagenen Text als Abfrage an Ihre durchsuchbare Aktivität gesendet.

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

Contentanbieter erstellen

Der Contentanbieter, den Sie für Vorschläge für aktuelle Suchanfragen benötigen, ist eine Implementierung von SearchRecentSuggestionsProvider. Diese Klasse erledigt alles für Sie. Sie müssen nur einen Klassenkonstruktor schreiben, der eine Codezeile ausführt.

Hier ist ein Beispiel für eine vollständige Implementierung eines Contentanbieters für Vorschläge für aktuelle Suchanfragen:

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 von setupSuggestions() übergibt den Namen der Suchautorität und einen Datenbankmodus. Die Suchautorität kann ein beliebiger eindeutiger String sein. Es empfiehlt sich jedoch, einen vollständig 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 enthalten und kann optional DATABASE_MODE_2LINES enthalten. Dadurch wird der Vorschlagstabelle eine Spalte hinzugefügt, sodass Sie mit jedem Vorschlag eine zweite Textzeile angeben können. Wenn Sie in jedem Vorschlag zwei Zeilen angeben möchten, sehen Sie sich das folgende Beispiel an:

Kotlin

const val MODE: Int = DATABASE_MODE_QUERIES or DATABASE_MODE_2LINES

Java

public final static int MODE = DATABASE_MODE_QUERIES | DATABASE_MODE_2LINES;

Deklarieren Sie den Contentanbieter in Ihrem Anwendungsmanifest mit demselben Autoritätsstring, der in Ihrer SearchRecentSuggestionsProvider-Klasse und in der durchsuchbaren Konfiguration verwendet wird. Beispiel:

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

Durchsuchbare Konfiguration ändern

Wenn Sie das System so konfigurieren möchten, dass es Ihren Vorschlagsanbieter verwendet, fügen Sie der Datei mit der durchsuchbaren Konfiguration dem <searchable> Element die android:searchSuggestAuthority und android:searchSuggestSelection Attribute hinzu. 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>

Der Wert für android:searchSuggestAuthority muss ein voll qualifizierter Name für Ihren Contentanbieter sein, der genau mit der im Contentanbieter verwendeten Autorität übereinstimmt, z. B. "com.example.MySuggestionProvider" in den vorherigen Beispielen.

Der Wert für android:searchSuggestSelection muss ein einzelnes Fragezeichen sein, dem ein Leerzeichen vorangestellt ist: " ?". Dies ist ein Platzhalter für das SQLite-Auswahlargument, das automatisch durch den vom Nutzer eingegebenen Abfragetext ersetzt wird.

Suchanfragen speichern

Wenn Sie Ihre Sammlung aktueller Suchanfragen füllen möchten, fügen Sie jede von Ihrer durchsuchbaren Aktivität empfangene Suchanfrage zu SearchRecentSuggestionsProvider hinzu. Erstellen Sie dazu eine Instanz von SearchRecentSuggestions und rufen Sie saveRecentQuery() auf, wenn Ihre durchsuchbare Aktivität eine Suchanfrage erhält. So können Sie beispielsweise die Suchanfrage während der onCreate()-Methode Ihrer Aktivität speichern:

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 dieselbe Autorität und denselben Datenbankmodus, die von Ihrem Contentanbieter deklariert wurden.

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

Vorschlagsdaten löschen

Zum Schutz der Privatsphäre des Nutzers müssen Sie ihm immer die Möglichkeit geben, die Vorschläge für aktuelle Suchanfragen zu löschen. Rufen Sie clearHistory() auf, um den Suchverlauf zu löschen. Beispiel:

Kotlin

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

Java

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

Führen Sie diesen Code über ein Menüelement, ein Einstellungselement oder eine Schaltfläche zum Löschen des Suchverlaufs aus. Stellen Sie ein Bestätigungsdialogfeld bereit, um zu bestätigen, dass der Nutzer seinen Suchverlauf löschen möchte.