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
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:
- 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.
- Ihr Contentanbieter gibt eine
Cursor
, die auf alle verweisen Vorschläge, die dem Text der Suchanfrage entsprechen. - 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.