Wenn Sie Ihrer App eine Suchfunktion hinzufügen möchten, können Sie in Android die Benutzeroberfläche entweder mit einem Suchdialogfeld, das oben im Aktivitätsfenster angezeigt wird, oder mit einem Such-Widget implementieren, das Sie in Ihr Layout einfügen können. Sowohl der Suchdialog als auch das Widget können die Suchanfrage des Nutzers an eine bestimmte Aktivität in Ihrer App senden. Auf diese Weise kann der Nutzer eine Suche aus jeder Aktivität starten, bei der das Suchdialogfeld oder -Widget verfügbar ist, und das System startet die entsprechende Aktivität, um die Suche durchzuführen und Ergebnisse anzuzeigen.
Weitere Funktionen, die für den Suchdialog und das Widget verfügbar sind:
- Sprachsuche
- Suchvorschläge auf Basis der letzten Suchanfragen
- Suchvorschläge, die mit den tatsächlichen Ergebnissen in Ihren App-Daten übereinstimmen
In diesem Dokument wird beschrieben, wie du deine App so einrichtest, dass sie eine Suchoberfläche bereitstellt, die vom Android-System zur Übermittlung von Suchanfragen über das Suchdialogfeld oder das Such-Widget unterstützt wird.
Weitere Informationen:
Grundlagen
Entscheiden Sie zuerst, ob Sie die Suchoberfläche über das Suchdialogfeld oder das Such-Widget implementieren möchten. Sie bieten die gleichen Suchfunktionen, aber auf leicht unterschiedliche Weise:
- Das Dialogfeld für die Suche ist eine UI-Komponente, die vom Android-System gesteuert wird. Wenn das Dialogfeld vom Nutzer aktiviert wurde, wird es oben in der Aktivität angezeigt.
Das Android-System steuert alle Ereignisse im Suchdialogfeld. Wenn der Nutzer eine Abfrage sendet, liefert das System diese Abfrage an die Aktivität, die Sie für die Verarbeitung der Suchanfragen angegeben haben. Während der Eingabe können über das Dialogfeld auch Suchvorschläge angezeigt werden.
- Das Such-Widget ist eine Instanz von
SearchView
, die Sie an einer beliebigen Stelle im Layout platzieren können. Das Such-Widget verhält sich standardmäßig wie ein standardmäßigesEditText
-Widget und hat keine Funktion. Du kannst es aber so konfigurieren, dass das Android-System alle Eingabeereignisse verarbeitet, Anfragen an die entsprechende Aktivität liefert und Suchvorschläge ausgibt – genau wie das Suchdialogfeld.
Wenn der Nutzer eine Suche über den Suchdialog oder ein Such-Widget ausführt, erstellt das System eine Intent
und speichert die Nutzerabfrage darin. Das System startet dann die Aktivität, die Sie für die Verarbeitung von Suchanfragen deklariert haben, also die „suchbare Aktivität“, und liefert den Intent. Um Ihre App für diese Art der unterstützten Suche einzurichten, benötigen Sie Folgendes:
- Eine Suchkonfiguration
- Eine XML-Datei, in der einige Einstellungen für das Suchdialogfeld oder -Widget konfiguriert werden. Dazu gehören Einstellungen für Funktionen wie die Sprachsuche, Suchvorschläge und Hinweistext für das Suchfeld.
- Eine durchsuchbare Aktivität
- Der
Activity
, der die Suchanfrage empfängt, Ihre Daten durchsucht und die Suchergebnisse anzeigt.- Eine Suchoberfläche, die von einem der folgenden Anbieter bereitgestellt wird:
- Das Suchdialogfeld
- Das Dialogfeld für die Suche ist standardmäßig ausgeblendet. Es wird oben auf dem Bildschirm angezeigt, wenn du
onSearchRequested()
aufrufst und der Nutzer auf die Schaltfläche Suchen tippt.- Ein
SearchView
-Widget- Mit dem Such-Widget können Sie das Suchfeld an einer beliebigen Stelle in Ihrer Aktivität platzieren, auch als Aktionsansicht in der App-Leiste.
- Ein
Im weiteren Verlauf dieses Dokuments erfahren Sie, wie Sie die Suchkonfiguration und die durchsuchbaren Aktivität erstellen und eine Suchoberfläche entweder mit dem Suchdialogfeld oder dem Such-Widget implementieren.
Suchbare Konfiguration erstellen
Als Erstes benötigen Sie eine XML-Datei, die als Suchkonfiguration bezeichnet wird.
Damit werden bestimmte UI-Aspekte des Suchdialogfelds oder -Widgets konfiguriert und das Verhalten von Funktionen wie Vorschlägen und der Sprachsuche definiert. Diese Datei hat den traditionellen Namen searchable.xml
und muss im Projektverzeichnis res/xml/
gespeichert werden.
Die Konfigurationsdatei für die Suche muss das Element <searchable>
als Stammknoten enthalten und mindestens ein Attribut angeben, wie im folgenden Beispiel gezeigt:
<?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" > </searchable>
Das Attribut android:label
ist das einzige erforderliche Attribut. Er verweist auf eine Stringressource, bei der es sich um den Anwendungsnamen handeln muss. Der Nutzer kann dieses Label erst sehen, wenn Sie Suchvorschläge für das Schnellsuchfeld aktiviert haben. Das Label wird dann in den Systemeinstellungen in der Liste der durchsuchbaren Elemente angezeigt.
Wir empfehlen, immer das Attribut android:hint
anzugeben, das einen Hinweisstring im Suchfeld enthält, bevor Nutzer eine Abfrage eingeben, obwohl dies nicht erforderlich ist. Der Hinweis ist wichtig, weil er den Nutzenden
Anhaltspunkte darüber gibt, was sie suchen können.
Für das <searchable>
-Element sind mehrere andere Attribute zulässig.
Die meisten Attribute werden jedoch erst benötigt, wenn Sie Features wie Suchvorschläge und die Sprachsuche hinzufügen. Ausführliche Informationen zur Konfigurationsdatei für die Suche finden Sie im Referenzdokument zur Konfiguration der Suche.
Suchbare Aktivität erstellen
Eine durchsuchbare Aktivität ist die Activity
in Ihrer Anwendung, die Suchvorgänge anhand eines Abfragestrings durchführt und die Suchergebnisse präsentiert.
Wenn der Nutzer im Suchdialogfeld oder -Widget eine Suche ausführt, startet das System die durchsuchbare Aktivität und übergibt sie in einem Intent
mit der Aktion ACTION_SEARCH
. Die durchsuchbare Aktivität ruft die Abfrage aus dem QUERY
-Extra des Intents ab, durchsucht dann Ihre Daten und präsentiert die Ergebnisse.
Da Sie das Suchdialogfeld oder -Widget in jede andere Aktivität in Ihrer App einbinden können, muss das System wissen, welche Aktivität Ihre durchsuchbare Aktivität ist, damit die Suchanfrage ordnungsgemäß gesendet werden kann. Deklarieren Sie also zunächst Ihre durchsuchbaren Aktivitäten in der Android-Manifestdatei.
Eine durchsuchbare Aktivität deklarieren
Erstellen Sie ein Activity
, das Suchanfragen ausführt und Ergebnisse präsentiert, falls Sie noch keines haben. Sie müssen die Suchfunktion noch nicht implementieren. Erstellen Sie einfach eine Aktivität, die Sie im Manifest deklarieren können. Führen Sie im <activity>
-Element des Manifests die folgenden Schritte aus:
- Deklarieren Sie die Aktivität, mit der der Intent
ACTION_SEARCH
in einem<intent-filter>
-Element akzeptiert wird. - Geben Sie die Suchkonfiguration an, die in einem
<meta-data>
-Element verwendet werden soll.
Dies wird im folgenden Beispiel veranschaulicht:
<application ... > <activity android:name=".SearchableActivity" > <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable"/> </activity> ... </application>
Das <meta-data>
-Element muss das Attribut android:name
mit dem Wert "android.app.searchable"
und das Attribut android:resource
mit einem Verweis auf die durchsuchbare Konfigurationsdatei enthalten. Im vorherigen Beispiel bezieht sich er auf die Datei res/xml/searchable.xml
.
Suche ausführen
Nachdem Sie Ihre durchsuchbare Aktivität im Manifest deklariert haben, gehen Sie so vor, um eine Suche in Ihrer durchsuchbaren Aktivität durchzuführen:
Abfrage erhalten
Wenn ein Nutzer eine Suche über den Suchdialog oder das Such-Widget ausführt, startet das System die durchsuchbare Aktivität und sendet dafür einen ACTION_SEARCH
-Intent. Dieser Intent enthält die Suchanfrage im zusätzlichen String QUERY
. Prüfen Sie diesen Intent zu Beginn der Aktivität und extrahieren Sie den String.
So erhalten Sie beispielsweise die Suchanfrage, wenn Ihre durchsuchbaren Aktivitäten beginnen:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.search) // Verify the action and get the query. if (Intent.ACTION_SEARCH == intent.action) { intent.getStringExtra(SearchManager.QUERY)?.also { query -> doMySearch(query) } } }
Java
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.search); // Get the intent, verify the action, and get the query. Intent intent = getIntent(); if (Intent.ACTION_SEARCH.equals(intent.getAction())) { String query = intent.getStringExtra(SearchManager.QUERY); doMySearch(query); } }
Der String QUERY
ist immer im Intent ACTION_SEARCH
enthalten. Im vorherigen Beispiel wird die Abfrage abgerufen und an eine lokale doMySearch()
-Methode übergeben, in der der eigentliche Suchvorgang ausgeführt wird.
In Daten suchen
Das Speichern und Durchsuchen Ihrer Daten hängt von Ihrer Anwendung ab. Es gibt viele Möglichkeiten, Ihre Daten zu speichern und zu durchsuchen. Dieses Dokument zeigt Ihnen nicht, wie das geht. Überlegen Sie, wie Sie Ihre Daten im Hinblick auf Ihre Anforderungen und Ihr Datenformat speichern und durchsuchen möchten. Hier sind einige Tipps, die Sie anwenden können:
- Wenn die Daten in einer SQLite-Datenbank auf dem Gerät gespeichert sind, kann eine Volltextsuche mit FTS3 anstelle einer
LIKE
-Abfrage durchgeführt werden, um eine zuverlässigere Suche in Textdaten zu ermöglichen und Ergebnisse deutlich schneller zu erhalten. Unter sqlite.org findest du Informationen zu FTS3 und dieSQLiteDatabase
-Klasse für Informationen zu SQLite unter Android. - Wenn Ihre Daten online gespeichert werden, kann die wahrgenommene Suchleistung durch die Datenverbindung des Nutzers beeinträchtigt werden. Es kann sinnvoll sein, eine Fortschrittsanzeige einzublenden, bis die Suche zurückkehrt. Unter
android.net
finden Sie eine Referenz zu Netzwerk-APIs. UnterProgressBar
finden Sie Informationen zum Anzeigen einer Fortschrittsanzeige.
Präsentation der Ergebnisse
Unabhängig davon, wo sich Ihre Daten befinden und wie Sie danach suchen, empfehlen wir, Suchergebnisse mit einem Adapter
für Ihre durchsuchbaren Aktivitäten zurückzugeben. So können Sie alle Suchergebnisse in einem RecyclerView
präsentieren.
Wenn Ihre Daten aus einer SQLite-Datenbankabfrage stammen, können Sie die Ergebnisse mithilfe von CursorAdapter
auf ein RecyclerView
anwenden.
Wenn Ihre Daten ein anderes Format haben, können Sie die Erweiterung BaseAdapter
erstellen.
Ein Adapter
bindet jedes Element aus einem Dataset an ein View
-Objekt. Wenn Adapter
auf eine RecyclerView
angewendet wird, wird jedes Datenelement als einzelne Ansicht in die Liste eingefügt. Adapter
ist nur eine Schnittstelle, daher sind Implementierungen wie CursorAdapter
zum Binden von Daten aus einer Cursor
erforderlich. Wenn keine der vorhandenen Implementierungen für Ihre Daten funktioniert, können Sie Ihre eigene über BaseAdapter
implementieren.
Dialogfeld „Suchen“ verwenden
Im Suchdialogfeld ist oben auf dem Bildschirm ein unverankertes Suchfeld mit dem App-Symbol links verfügbar. Im Suchdialogfeld werden während der Eingabe Suchvorschläge angezeigt. Wenn der Nutzer eine Suche ausführt, sendet das System die Suchanfrage an eine durchsuchbare Aktivität, die die Suche ausführt.
Das Dialogfeld für die Suche ist standardmäßig ausgeblendet, bis der Nutzer es aktiviert.
In Ihrer App kann das Suchdialogfeld durch Aufrufen von onSearchRequested()
aktiviert werden. Diese Methode funktioniert jedoch erst, wenn Sie das Suchdialogfeld für die Aktivität aktivieren.
Damit über das Suchdialogfeld Suchvorgänge ausgeführt werden können, müssen Sie dem System angeben, welche suchbare Aktivität Suchanfragen aus dem Suchdialogfeld erhalten muss. Im vorherigen Abschnitt zum Erstellen einer suchbaren Aktivität wird beispielsweise eine durchsuchbare Aktivität mit dem Namen SearchableActivity
erstellt. Wenn Sie möchten, dass eine separate Aktivität wie eine mit dem Namen OtherActivity
das Suchdialogfeld anzeigt und Suchanfragen an SearchableActivity
sendet, deklarieren Sie im Manifest, dass SearchableActivity
die durchsuchbare Aktivität ist, die für das Suchdialogfeld in OtherActivity
verwendet werden soll.
Wenn Sie die durchsuchbare Aktivität für das Suchdialogfeld einer Aktivität deklarieren möchten, fügen Sie im <activity>
-Element der entsprechenden Aktivität ein <meta-data>
-Element hinzu. Das Element <meta-data>
muss das Attribut android:value
enthalten, das den Klassennamen der suchbaren Aktivität angibt, und das Attribut android:name
mit dem Wert "android.app.default_searchable"
.
Im Folgenden finden Sie beispielsweise die Deklaration für die durchsuchbare Aktivität SearchableActivity
und die andere Aktivität OtherActivity
, die SearchableActivity
verwendet, um Suchvorgänge auszuführen, die über den Suchdialog ausgeführt werden:
<application ... > <!-- This is the searchable activity; it performs searches. --> <activity android:name=".SearchableActivity" > <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable"/> </activity> <!-- This activity enables the search dialog to initiate searches in the SearchableActivity. --> <activity android:name=".OtherActivity" ... > <!-- Enable the search dialog to send searches to SearchableActivity. --> <meta-data android:name="android.app.default_searchable" android:value=".SearchableActivity" /> </activity> ... </application>
Da OtherActivity
jetzt ein <meta-data>
-Element enthält, mit dem deklariert wird, welche suchbare Aktivität für Suchanfragen verwendet werden soll, aktiviert die Aktivität den Suchdialog. Obwohl sich der Nutzer in dieser Aktivität befindet, aktiviert die Methode onSearchRequested()
den Suchdialog. Wenn der Nutzer die Suche ausführt, startet das System SearchableActivity
und sendet den Intent ACTION_SEARCH
.
Wenn der Suchdialog für jede Aktivität in Ihrer App verfügbar sein soll, fügen Sie das vorherige <meta-data>
-Element als untergeordnetes Element des <application>
-Elements und nicht jedes <activity>
-Elements ein. Auf diese Weise übernimmt jede Aktivität den Wert, stellt den Suchdialog bereit und stellt Suchanfragen für dieselbe suchbare Aktivität bereit. Wenn es mehrere durchsuchbare Aktivitäten gibt, können Sie die standardmäßig durchsuchbare Aktivitäten überschreiben, indem Sie innerhalb der einzelnen Aktivitäten eine andere <meta-data>
-Deklaration platzieren.
Da das Suchdialogfeld jetzt für Ihre Aktivitäten aktiviert ist, kann Ihre Anwendung Suchanfragen ausführen.
Dialogfeld „Suchen“ aufrufen
Auf einigen Geräten gibt es zwar eine spezielle Suchschaltfläche, aber das Verhalten dieser Schaltfläche kann je nach Gerät variieren. Auf vielen Geräten gibt es diese Schaltfläche gar nicht. Wenn Sie also das Suchdialogfeld verwenden, müssen Sie in Ihrer UI eine Suchschaltfläche angeben, mit der das Suchdialogfeld durch Aufrufen von onSearchRequested()
aktiviert wird.
Fügen Sie beispielsweise dem Optionsmenü oder dem UI-Layout, das onSearchRequested()
aufruft, eine Suchschaltfläche hinzu.
Sie können auch die Funktion „Zum Suchen eintippen“ aktivieren. Dadurch wird das Suchdialogfeld aktiviert, wenn der Nutzer mit der Eingabe auf der Tastatur beginnt. Die Tastenanschläge werden
in den Suchdialog eingefügt. Sie können die Suche über die Tastatur in Ihrer Aktivität aktivieren, indem Sie während der Methode onCreate()
Ihrer Aktivität setDefaultKeyMode
oder DEFAULT_KEYS_SEARCH_LOCAL
aufrufen.
Die Auswirkungen des Suchdialogfelds auf den Aktivitätslebenszyklus
Das Suchdialogfeld ist ein Dialog
-Element am oberen Bildschirmrand. Dies verursacht keine Änderungen im Aktivitätsstapel. Wenn das Suchdialogfeld angezeigt wird, werden daher keine Lebenszyklusmethoden wie onPause()
aufgerufen. Ihre Aktivität verliert den Eingabefokus, da der Eingabefokus dem Suchdialogfeld zugewiesen wird.
Wenn Sie bei Aktivierung des Suchdialogfelds benachrichtigt werden möchten, überschreiben Sie die Methode onSearchRequested()
. Wenn das System diese Methode aufruft, ist das ein Hinweis darauf, dass der Eingabefokus Ihrer Aktivität nicht mehr auf das Suchdialogfeld gesetzt wird, sodass Sie für das Ereignis geeignete Maßnahmen ergreifen können, z. B. ein Spiel pausieren. Wenn Sie keine Suchkontextdaten übergeben, wie in einem anderen Abschnitt dieses Dokuments erläutert, beenden Sie die Methode durch Aufrufen der Implementierung der übergeordneten Klasse:
Kotlin
override fun onSearchRequested(): Boolean { pauseSomeStuff() return super.onSearchRequested() }
Java
@Override public boolean onSearchRequested() { pauseSomeStuff(); return super.onSearchRequested(); }
Wenn der Nutzer die Suche durch Tippen auf die Schaltfläche „Zurück“ abbricht, wird der Suchdialog geschlossen und die Aktivität erhält wieder den Eingabefokus. Sie können festlegen, dass Sie benachrichtigt werden, wenn das Suchdialogfeld geschlossen wird. Verwenden Sie dazu setOnDismissListener()
, setOnCancelListener()
oder beides. Sie müssen nur das OnDismissListener
registrieren, da es jedes Mal aufgerufen wird, wenn der Suchdialog geschlossen wird. Das OnCancelListener
bezieht sich nur auf Ereignisse, bei denen der Nutzer das Suchdialogfeld explizit schließt. Es wird also nicht aufgerufen, wenn eine Suche ausgeführt wird. Wenn die Suche ausgeführt wird, verschwindet das Dialogfeld für die Suche automatisch.
Wenn die aktuelle Aktivität nicht die durchsuchbare Aktivität ist, werden die normalen Ereignisse im Aktivitätslebenszyklus ausgelöst, wenn der Nutzer eine Suche ausführt. Die aktuelle Aktivität erhält onPause()
, wie unter Einführung in Aktivitäten beschrieben. Wenn es sich bei der aktuellen Aktivität jedoch um die durchsuchbare Aktivität handelt, geschieht Folgendes:
- Standardmäßig empfängt die durchsuchbare Aktivität den Intent
ACTION_SEARCH
mit einem Aufruf vononCreate()
und eine neue Instanz der Aktivität wird an den Anfang des Aktivitätsstapels gebracht. Es gibt jetzt zwei Instanzen Ihrer durchsuchbaren Aktivität im Aktivitätsstapel. Wenn Sie also auf die Schaltfläche „Zurück“ tippen, gelangen Sie zurück zur vorherigen Instanz der durchsuchbaren Aktivität, anstatt die durchsuchbare Aktivität zu verlassen. - Wenn Sie
android:launchMode
auf"singleTop"
setzen, empfängt die durchsuchbare Aktivität den IntentACTION_SEARCH
mit einem Aufruf vononNewIntent(Intent)
und übergibt den neuen IntentACTION_SEARCH
. So könnten Sie z. B. vorgehen, wenn der Startmodus der durchsuchbaren Aktivität"singleTop"
ist:Kotlin
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.search) handleIntent(intent) } override fun onNewIntent(intent: Intent) { super.onNewIntent(intent) setIntent(intent) handleIntent(intent) } private fun handleIntent(intent: Intent) { if (Intent.ACTION_SEARCH == intent.action) { intent.getStringExtra(SearchManager.QUERY)?.also { query -> doMySearch(query) } } }
Java
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.search); handleIntent(getIntent()); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); handleIntent(intent); } private void handleIntent(Intent intent) { if (Intent.ACTION_SEARCH.equals(intent.getAction())) { String query = intent.getStringExtra(SearchManager.QUERY); doMySearch(query); } }
Verglichen mit dem Beispielcode im Abschnitt zum Durchführen einer Suche befindet sich der gesamte Code zur Verarbeitung des Suchabsichtsinhalts jetzt in der
handleIntent()
-Methode, sodass sowohlonCreate()
als auchonNewIntent()
ihn ausführen können.Wenn das System
onNewIntent(Intent)
aufruft, wird die Aktivität nicht neu gestartet. Daher gibt die MethodegetIntent()
denselben Intent zurück, der mitonCreate()
empfangen wird. Aus diesem Grund müssen SiesetIntent(Intent)
innerhalb vononNewIntent(Intent)
aufrufen, damit der von der Aktivität gespeicherte Intent aktualisiert wird, falls SiegetIntent()
in Zukunft aufrufen.
Das zweite Szenario, in dem der Startmodus "singleTop"
verwendet wird, ist normalerweise vorzuziehen, da der Nutzer nach einer Suche unter Umständen weitere Suchanfragen ausführen kann und Sie nicht möchten, dass Ihre Anwendung mehrere Instanzen der suchbaren Aktivität erstellt. Wir empfehlen, die durchsuchbare Aktivität im App-Manifest auf den Startmodus "singleTop"
festzulegen, wie im folgenden Beispiel gezeigt:
<activity android:name=".SearchableActivity" android:launchMode="singleTop" > <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable"/> </activity>
Suchkontextdaten übergeben
In einigen Fällen können Sie bei jeder Suche die Suchabfrage innerhalb der durchsuchbaren Aktivität verfeinern. Wenn Sie jedoch Ihre Suchkriterien auf der Grundlage der Aktivität, mit der der Nutzer eine Suche durchführt, verfeinern möchten, können Sie zusätzliche Daten in dem Intent angeben, den das System an Ihre durchsuchbare Aktivität sendet. Sie können die zusätzlichen Daten im APP_DATA
-Bundle
übergeben, der im ACTION_SEARCH
-Intent enthalten ist.
Um diese Art von Daten an Ihre durchsuchbare Aktivität zu übergeben, überschreiben Sie die Methode onSearchRequested()
für die Aktivität, über die der Nutzer eine Suche durchführen kann, erstellen Sie ein Bundle
mit den zusätzlichen Daten und rufen Sie startSearch()
auf, um das Suchdialogfeld zu aktivieren. Beispiele:
Kotlin
override fun onSearchRequested(): Boolean { val appData = Bundle().apply { putBoolean(JARGON, true) } startSearch(null, false, appData, false) return true }
Java
@Override public boolean onSearchRequested() { Bundle appData = new Bundle(); appData.putBoolean(SearchableActivity.JARGON, true); startSearch(null, false, appData, false); return true; }
Wenn Sie „true“ zurückgeben, wird das Callback-Ereignis erfolgreich verarbeitet und startSearch()
aufgerufen, um das Suchdialogfeld zu aktivieren. Nachdem der Nutzer eine Abfrage gesendet hat, wird diese zusammen mit den von Ihnen hinzugefügten Daten an Ihre durchsuchbare Aktivität übergeben. Sie können die zusätzlichen Daten aus dem APP_DATA
-Bundle
extrahieren, um die Suche zu verfeinern, wie im folgenden Beispiel gezeigt:
Kotlin
val jargon: Boolean = intent.getBundleExtra(SearchManager.APP_DATA)?.getBoolean(JARGON) ?: false
Java
Bundle appData = getIntent().getBundleExtra(SearchManager.APP_DATA); if (appData != null) { boolean jargon = appData.getBoolean(SearchableActivity.JARGON); }
Such-Widget verwenden
![Ein Bild, das eine Suchansicht in der oberen Leiste der App zeigt](https://developer.android.com/static/images/ui/search-ui-topbar-33.png?authuser=6&hl=de)
Abbildung 1: Das SearchView
-Widget als Aktionsansicht in der App-Leiste.
Das Such-Widget bietet dieselbe Funktion wie das Suchdialogfeld. Die entsprechende Aktivität wird gestartet, wenn der Nutzer eine Suche ausführt, und kann Suchvorschläge machen und eine Sprachsuche durchführen. Wenn Sie das Such-Widget nicht in der App-Leiste platzieren können, können Sie es stattdessen irgendwo im Aktivitätslayout platzieren.
Such-Widget konfigurieren
Nachdem Sie eine Suchkonfiguration und eine suchbare Aktivität erstellt haben, aktivieren Sie die unterstützte Suche für jede SearchView
. Rufen Sie dazu setSearchableInfo()
auf und übergeben Sie das SearchableInfo
-Objekt, das die durchsuchbare Konfiguration darstellt.
Sie können einen Verweis auf das SearchableInfo
abrufen, indem Sie getSearchableInfo()
bei SearchManager
aufrufen.
Wenn Sie beispielsweise ein SearchView
als Aktionsansicht in der App-Leiste verwenden, aktivieren Sie das Widget während des onCreateOptionsMenu()
-Callbacks, wie im folgenden Beispiel gezeigt:
Kotlin
override fun onCreateOptionsMenu(menu: Menu): Boolean { // Inflate the options menu from XML. val inflater = menuInflater inflater.inflate(R.menu.options_menu, menu) // Get the SearchView and set the searchable configuration. val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager (menu.findItem(R.id.menu_search).actionView as SearchView).apply { // Assumes current activity is the searchable activity. setSearchableInfo(searchManager.getSearchableInfo(componentName)) setIconifiedByDefault(false) // Don't iconify the widget. Expand it by default. } return true }
Java
@Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the options menu from XML. MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.options_menu, menu); // Get the SearchView and set the searchable configuration. SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView(); // Assumes current activity is the searchable activity. searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); searchView.setIconifiedByDefault(false); // Don't iconify the widget. Expand it by default. return true; }
Das Such-Widget ist jetzt konfiguriert und das System sendet Suchanfragen an Ihre durchsuchbare Aktivität. Sie können auch Suchvorschläge für das Such-Widget aktivieren.
Weitere Informationen zu Aktionsansichten in der App-Leiste finden Sie unter Aktionsansichten und Aktionsanbieter verwenden.
Weitere Funktionen des Such-Widgets
Das SearchView
-Widget bietet einige zusätzliche Funktionen, die Sie interessieren könnten:
- Eine Schaltfläche zum Senden
- Standardmäßig gibt es keine Schaltfläche zum Senden einer Suchanfrage. Der Nutzer muss also die Eingabetaste auf der Tastatur drücken, um eine Suche zu starten. Du kannst die Schaltfläche „Senden“ hinzufügen, indem du
setSubmitButtonEnabled(true)
aufrufst. - Suchanfragenverfeinerung für Suchvorschläge
- Wenn Sie Suchvorschläge aktivieren, erwarten Sie in der Regel, dass Nutzer einen Vorschlag auswählen. Es ist aber auch möglich, dass sie die vorgeschlagene Suchanfrage verfeinern möchten.
Du kannst neben jedem Vorschlag eine Schaltfläche hinzufügen, über die der Vorschlag in das Suchfeld eingefügt wird, um den Nutzer zu präzisieren, indem du
setQueryRefinementEnabled(true)
aufrufst. - Die Möglichkeit zum Ein-/Ausschalten der Sichtbarkeit des Suchfelds
- Standardmäßig ist das Such-Widget „Symbol“, d. h. es wird nur durch ein Suchsymbol – eine Lupe – dargestellt. Wenn der Nutzer auf das Symbol tippt, wird das Suchfeld erweitert. Wie im vorherigen Beispiel gezeigt, kannst du das Suchfeld standardmäßig anzeigen lassen, indem du
setIconifiedByDefault(false)
aufrufst. Du kannst die Darstellung des Such-Widgets auch durch Aufrufen vonsetIconified()
ein-/ausschalten.
In der SearchView
-Klasse gibt es mehrere andere APIs, mit denen Sie das Such-Widget anpassen können. Die meisten von ihnen werden jedoch nur verwendet, wenn Sie alle Nutzereingaben selbst vornehmen, anstatt das Android-System zum Bereitstellen von Suchanfragen und Anzeigen von Suchvorschlägen zu verwenden.
Widget und Dialogfeld verwenden
Wenn Sie das Such-Widget in die App-Leiste als Aktionsansicht einfügen und aktivieren, dass es in der App-Leiste angezeigt werden kann, wenn genug Platz ist, indem Sie android:showAsAction="ifRoom"
festlegen, wird das Such-Widget möglicherweise nicht als Aktionsansicht angezeigt. Stattdessen wird im Dreipunkt-Menü möglicherweise ein Menüpunkt angezeigt. Wenn Ihre App beispielsweise auf einem kleineren Bildschirm ausgeführt wird, ist in der App-Leiste möglicherweise nicht genügend Platz, um das Such-Widget zusammen mit anderen Aktionselementen oder Navigationselementen anzuzeigen, sodass der Menüpunkt stattdessen im Dreipunkt-Menü angezeigt wird. Wenn das Element im Dreipunkt-Menü platziert wird, funktioniert es wie ein gewöhnliches Menüelement. Es wird nicht die Aktionsansicht, also das Such-Widget, angezeigt.
In diesem Fall muss der Menüpunkt, an den Sie das Such-Widget anhängen, den Suchdialog aktivieren, wenn der Nutzer ihn im Dreipunkt-Menü auswählt.
Implementieren Sie dazu onOptionsItemSelected()
für den Menüpunkt „Suchen“ und öffnen Sie das Suchdialogfeld durch Aufrufen von onSearchRequested()
.
Weitere Informationen zur Funktionsweise von Elementen in der App-Leiste und zum Umgang mit dieser Situation finden Sie unter App-Leiste hinzufügen.
Sprachsuche hinzufügen
Sie können Ihrem Suchdialog oder -Widget eine Sprachsuche hinzufügen. Dazu fügen Sie der durchsuchbaren Konfiguration das Attribut android:voiceSearchMode
hinzu. Dadurch wird eine Schaltfläche für die Sprachsuche hinzugefügt, mit der eine Ansage zur Spracheingabe gestartet wird.
Wenn der Nutzer zu sprechen aufhört, wird die transkribierte Suchanfrage an Ihre suchbare Aktivität gesendet.
Dies wird im folgenden Beispiel veranschaulicht:
<?xml version="1.0" encoding="utf-8"?> <searchable xmlns:android="http://schemas.android.com/apk/res/android" android:label="@string/search_label" android:hint="@string/search_hint" android:voiceSearchMode="showVoiceSearchButton|launchRecognizer" > </searchable>
Der Wert showVoiceSearchButton
ist zum Aktivieren der Sprachsuche erforderlich. Der zweite Wert, launchRecognizer
, gibt an, dass die Schaltfläche für die Sprachsuche eine Erkennung starten muss, die den transkribierten Text an die durchsuchbare Aktivität zurückgibt.
Sie können zusätzliche Attribute angeben, um das Verhalten der Sprachsuche festzulegen, z. B. die erwartete Sprache und die maximale Anzahl der Ergebnisse, die zurückgegeben werden sollen. Weitere Informationen zu den verfügbaren Attributen finden Sie in der Referenz zur Suchkonfiguration.
Suchvorschläge hinzufügen
Sowohl das Suchdialogfeld als auch das Such-Widget können mithilfe des Android-Systems Suchvorschläge bereitstellen, während der Nutzer tippt. Das System verwaltet die Liste der Vorschläge und verarbeitet das Ereignis, wenn der Nutzer einen Vorschlag auswählt.
Sie können zwei Arten von Suchvorschlägen bereitstellen:
- Letzte Suchvorschläge
- Diese Vorschläge sind Wörter, die der Nutzer zuvor als Suchanfragen in Ihrer App verwendet hat. Weitere Informationen finden Sie unter Benutzerdefinierte Suchvorschläge hinzufügen.
- Benutzerdefinierte Suchvorschläge
- Dies sind Suchvorschläge, die Sie aus Ihrer eigenen Datenquelle zur Verfügung stellen, damit Nutzer sofort die richtige Schreibweise oder das gewünschte Element auswählen können. Weitere Informationen finden Sie unter Benutzerdefinierte Suchvorschläge hinzufügen.