Wir empfehlen, das SearchView
-Widget als Element in der App-Leiste zu verwenden, um eine Suchfunktion in Ihrer App bereitzustellen. Wie bei allen Elementen in der App-Leiste können Sie festlegen, dass das SearchView
immer oder nur angezeigt wird, wenn Platz vorhanden ist. Sie können sie auch als minimierbare Aktion definieren, bei der das Symbol SearchView
zuerst als Symbol angezeigt wird und dann die gesamte App-Leiste als Suchfeld einnimmt, wenn der Nutzer auf das Symbol tippt.
SearchView zur App-Leiste hinzufügen
Wenn Sie der App-Leiste ein SearchView
-Widget hinzufügen möchten, erstellen Sie in Ihrem Projekt eine Datei mit dem Namen res/menu/options_menu.xml
und fügen Sie ihr den folgenden Code hinzu. In diesem Code wird festgelegt, wie das Suchelement erstellt werden soll, z. B. das zu verwendende Symbol und der Titel des Elements. Mit dem Attribut collapseActionView
lässt sich Ihr SearchView
maximieren, sodass es die gesamte App-Leiste einnimmt, und minimieren, sodass es wieder zu einem normalen App-Leistenelement wird, wenn es nicht verwendet wird. Aufgrund des begrenzten Platzes in der App-Leiste auf Smartphones empfehlen wir, das Attribut collapsibleActionView
zu verwenden, um die Nutzerfreundlichkeit zu verbessern.
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/search" android:title="@string/search_title" android:icon="@drawable/ic_search" android:showAsAction="collapseActionView|ifRoom" android:actionViewClass="androidx.appcompat.widget.SearchView" /> </menu>
Wenn Sie ein barrierefreieres Suchsymbol wünschen, erstellen Sie im Ordner /res/drawable
eine Datei vom Typ ic_search.xml
und fügen Sie den folgenden Code ein:
<vector android:height="24dp" android:tint="#000000" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"> <path android:fillColor="@android:color/white" android:pathData="M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57l0.27,0.28v0.79l5,4.99L20.49,19l-4.99,-5zM9.5,14C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14z"/> </vector>
Wenn Sie das SearchView
in der App-Leiste anzeigen möchten, maximieren Sie die XML-Menüressource res/menu/options_menu.xml
in der onCreateOptionsMenu()
-Methode Ihrer Aktivität:
Kotlin
override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.options_menu, menu) return true }
Wenn Sie die App ausführen, wird in etwa Folgendes generiert:

Das Symbol SearchView
wird in der App-Leiste Ihrer App angezeigt, funktioniert aber nicht. Wenn Sie auf das Suchsymbol tippen, sehen Sie ungefähr Folgendes:

SearchView
in Aktion.
Damit SearchView
funktioniert, müssen Sie festlegen, wie SearchView
sich verhalten soll.
Suchkonfiguration erstellen
In einer Suchkonfiguration wird festgelegt, wie sich die SearchView
verhält. Sie wird in einer res/xml/searchable.xml
-Datei definiert. Eine Suchkonfiguration muss mindestens ein android:label
-Attribut mit demselben Wert wie das android:label
-Attribut des Elements <application> oder <activity> in Ihrem Android-Manifest enthalten. Wir empfehlen jedoch auch, ein android:hint
-Attribut hinzuzufügen, damit Nutzer eine Vorstellung davon haben, was sie in das Suchfeld eingeben sollen.
<?xml version="1.0" encoding="utf-8"?> <searchable xmlns:android="http://schemas.android.com/apk/res/android" android:label="@string/app_name" android:hint="@string/search_hint" />
Deklarieren Sie in der Manifestdatei Ihrer App ein <meta-data>
-Element, das auf die res/xml/searchable.xml
-Datei verweist. Deklarieren Sie das Element in einem <activity>
, in dem Sie das SearchView
anzeigen möchten.
<activity android:name=".SearchResultsActivity" android:exported="false" android:label="@string/title_activity_search_results" android:launchMode="singleTop" android:theme="@style/Theme.AppCompat.Light"> <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable" /> </activity>
Weisen Sie in der von Ihnen erstellten onCreateOptionsMenu()
-Methode die Suchkonfiguration der SearchView
zu, indem Sie setSearchableInfo(SearchableInfo)
aufrufen:
Kotlin
override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.options_menu, menu) val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager val searchView = menu.findItem(R.id.search).actionView as SearchView val component = ComponentName(this, SearchResultsActivity::class.java) val searchableInfo = searchManager.getSearchableInfo(component) searchView.setSearchableInfo(searchableInfo) return true }
Über den Aufruf von getSearchableInfo()
wird ein SearchableInfo
-Objekt abgerufen, das aus der XML-Datei der Suchkonfiguration erstellt wird. Wenn die Suchkonfiguration richtig mit Ihrer SearchView
verknüpft ist und der Nutzer eine Suchanfrage stellt, startet die SearchView
eine Aktivität mit dem ACTION_SEARCH
-Intent. Sie benötigen dann eine Aktivität, die nach diesem Intent filtern und die Suchanfrage verarbeiten kann.
Suchbare Aktivität erstellen
Bei einer suchbaren Aktivität wird nach der ACTION_SEARCH
-Intention gefiltert und in einem Datensatz nach der Suchanfrage gesucht. Wenn Sie eine suchbare Aktivität erstellen möchten, deklarieren Sie eine Aktivität Ihrer Wahl, um nach der ACTION_SEARCH
-Intention zu filtern:
<activity android:name=".SearchResultsActivity" ... > ... <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> ... </activity>
In Ihrer suchbaren Aktivität können Sie die ACTION_SEARCH
-Intent verarbeiten, indem Sie in der onCreate()
-Methode danach suchen.
Kotlin
class SearchResultsActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_search_results) handleIntent(intent) } override fun onNewIntent(intent: Intent) { super.onNewIntent(intent) handleIntent(intent) } private fun handleIntent(intent: Intent) { if (Intent.ACTION_SEARCH == intent.action) { val query = intent.getStringExtra(SearchManager.QUERY) Log.d("SEARCH", "Search query was: $query") } } }
Jetzt kann der SearchView
die Suchanfrage des Nutzers akzeptieren und die suchbare Aktivität mit dem ACTION_SEARCH
-Intent starten.
Nachdem Sie die Suchanfrage erhalten haben, können Sie sie an die ViewModel
übergeben, wo Sie sie in anderen Schichten Ihrer Architektur verwenden können, um die anzuzeigenden Suchergebnisse abzurufen.