Sie können Suchvorschläge basierend auf den letzten Suchanfragen im Android-Suchdialogfeld oder ‑Suchwidget 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 ein Suchdialogfeld mit Vorschlägen für aktuelle Suchanfragen.
Bevor Sie beginnen, müssen Sie das Suchdialogfeld oder ein Such-Widget für einfache Suchvorgänge in Ihrer Anwendung implementieren. Weitere Informationen zum Erstellen einer Suchoberfläche
Grundlagen

Abbildung 1: Screenshot eines Suchdialogfelds mit Vorschlägen für die letzten Suchanfragen.
Suchvorschläge anhand der letzten 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.
Damit Vorschläge für aktuelle Suchanfragen angezeigt werden können, müssen Sie Folgendes tun:
- 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.
- Bei jeder Suche werden Anfragen an Ihren Content-Anbieter gesendet.
So wie das Android-System das Suchdialogfeld anzeigt, werden auch die Suchvorschläge unter dem Dialogfeld 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 anzeigt, passiert Folgendes, wenn der Nutzer eine Suchanfrage eingibt:
- Das System verwendet den Text der Suchanfrage – also alles, was der Nutzer eingibt – und führt eine Anfrage an den Contentanbieter aus, die Ihre Vorschläge enthält.
- Ihr Contentanbieter gibt einen
Cursor
zurück, der auf alle Vorschläge verweist, die mit dem Text der Suchanfrage übereinstimmen. - Das System zeigt die Liste der Vorschläge an, die von
Cursor
bereitgestellt werden.
Wenn die Vorschläge für die letzten Suchanfragen angezeigt werden, kann Folgendes passieren:
- Wenn der Nutzer eine andere Taste eingibt oder die Anfrage in irgendeiner Weise ändert, werden die vorherigen Schritte wiederholt und die Vorschlagsliste wird aktualisiert.
- Wenn der Nutzer die Suche ausführt, werden die Vorschläge ignoriert und die Suche wird über den normalen
ACTION_SEARCH
-Intent an Ihre durchsuchbare Aktivität gesendet. - Wenn der Nutzer einen Vorschlag auswählt, wird ein
ACTION_SEARCH
-Intent mit dem vorgeschlagenen Text als Anfrage 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 aktuelle Suchvorschläge 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 beispielsweise eine vollständige Implementierung eines Contentanbieters für Vorschläge für die letzten 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); } }
Beim Aufruf von
setupSuggestions()
wird der Name der Suchautorität und ein Datenbankmodus übergeben. 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, in der Sie für jeden 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 Authority-String, der in Ihrer SearchRecentSuggestionsProvider
-Klasse und in der durchsuchbaren Konfiguration verwendet wird. Beispiel:
<application> <provider android:name=".MySuggestionProvider" android:authorities="com.example.MySuggestionProvider" /> ... </application>
Suchkonfiguration ändern
Wenn Sie das System so konfigurieren möchten, dass Ihr Vorschlagsanbieter verwendet wird, fügen Sie die Attribute android:searchSuggestAuthority
und android:searchSuggestSelection
dem <searchable>
-Element in Ihrer durchsuchbaren Konfigurationsdatei 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 vollqualifizierter Name für Ihren Content-Anbieter sein, der genau mit der im Content-Anbieter 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, der automatisch durch den vom Nutzer eingegebenen Abfragetext ersetzt wird.
Abfragen speichern
Um Ihre Sammlung der letzten Anfragen zu füllen, fügen Sie jede Anfrage, die von Ihrer durchsuchbaren Aktivität empfangen wird, zu SearchRecentSuggestionsProvider
hinzu. Erstellen Sie dazu eine Instanz von SearchRecentSuggestions
und rufen Sie saveRecentQuery()
jedes Mal auf, wenn Ihre durchsuchbare Aktivität eine Anfrage erhält. Hier sehen Sie ein Beispiel dafür, wie Sie die Abfrage während der Methode onCreate()
Ihrer Aktivität speichern können:
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); } }
Für den SearchRecentSuggestionsProvider
-Konstruktor sind dieselbe Authority und derselbe Datenbankmodus erforderlich, die von Ihrem Contentanbieter deklariert wurden.
Die Methode saveRecentQuery()
verwendet den Suchanfragestring 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 abgeglichen, wenn das System nach passenden Vorschlägen sucht.
Vorschlagsdaten löschen
Um die Privatsphäre des Nutzers zu schützen, sollten Sie ihm immer die Möglichkeit geben, die Vorschläge für die letzten Suchanfragen zu löschen. Rufen Sie clearHistory()
auf, um den Abfrageverlauf 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 Vorgang über ein Menüelement, ein Einstellungselement oder eine Schaltfläche Ihrer Wahl aus, z. B. „Suchverlauf löschen“. Stellen Sie ein Bestätigungsdialogfeld bereit, um zu prüfen, ob der Nutzer seinen Suchverlauf löschen möchte.