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
-Element immer angezeigt wird oder nur, wenn Platz vorhanden ist. Sie können es auch als minimierbare Aktion definieren, bei der das 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 der Datei den folgenden Code hinzu. Mit diesem Code wird festgelegt, wie das Suchelement erstellt wird, z. B. das zu verwendende Symbol und der Titel des Elements. Mit dem Attribut collapseActionView
kann die SearchView
maximiert werden, sodass sie die gesamte App-Leiste einnimmt und wieder zu einem normalen App-Leistenelement minimiert werden kann, wenn sie nicht verwendet wird. Aufgrund des begrenzten Platzes in der App-Leiste auf Mobilgeräten empfehlen wir die Verwendung des Attributs collapsibleActionView
für eine bessere Nutzererfahrung.
<?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 zugänglicheres Suchsymbol wünschen, erstellen Sie eine ic_search.xml
-Datei im Ordner /res/drawable
und fügen Sie den folgenden Code darin 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>
Um das SearchView
in der App-Leiste anzuzeigen, fließen Sie die XML-Menüressource res/menu/options_menu.xml
in der Methode onCreateOptionsMenu()
Ihrer Aktivität auf:
Kotlin
override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.options_menu, menu) return true }
Beim Ausführen der App wird in etwa Folgendes generiert:
Das SearchView
wird in der App-Leiste Ihrer App angezeigt, funktioniert aber nicht. Wenn du auf das Suchsymbol tippst, wird etwa Folgendes angezeigt:
Damit das SearchView
funktionsfähig ist, müssen Sie definieren, wie sich SearchView
verhält.
Suchkonfiguration erstellen
Eine Suchkonfiguration gibt an, wie sich SearchView
verhält, und ist in einer res/xml/searchable.xml
-Datei definiert. Eine Suchkonfiguration muss mindestens ein android:label
-Attribut enthalten, das denselben Wert wie das android:label
-Attribut des Elements <application> oder <activity> in deinem Android-Manifest hat. Wir empfehlen jedoch, auch ein android:hint
-Attribut hinzuzufügen, damit Nutzer eine Vorstellung davon erhalten, 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 Datei res/xml/searchable.xml
verweist. Deklarieren Sie das Element in einem <activity>
, in dem das SearchView
-Element angezeigt werden soll.
<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>
Verknüpfen Sie in der von Ihnen erstellten Methode onCreateOptionsMenu()
die Suchkonfiguration mit dem SearchView
, 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 }
Mit dem Aufruf von getSearchableInfo()
wird ein SearchableInfo
-Objekt abgerufen, das aus der XML-Datei für die Suchkonfiguration erstellt wird. Wenn die Suchkonfiguration korrekt Ihrem SearchView
zugeordnet ist und der Nutzer eine Abfrage sendet, startet SearchView
eine Aktivität mit dem Intent ACTION_SEARCH
. Sie benötigen dann eine Aktivität, die nach diesem Intent filtern und die Suchanfrage verarbeiten kann.
Suchbare Aktivität erstellen
Eine durchsuchbare Aktivität filtert nach dem Intent ACTION_SEARCH
und sucht in einem Dataset nach der Abfrage. Wenn Sie eine durchsuchbare Aktivität erstellen möchten, geben Sie eine Aktivität Ihrer Wahl an, um nach dem Intent ACTION_SEARCH
zu filtern:
<activity android:name=".SearchResultsActivity" ... > ... <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> ... </activity>
Prüfen Sie in Ihrer durchsuchbaren Aktivität den Intent ACTION_SEARCH
, indem Sie in der Methode onCreate()
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 das SearchView
die Abfrage des Nutzers akzeptieren und Ihre suchbare Aktivität mit dem Intent ACTION_SEARCH
starten.
Nachdem Sie die Suchanfrage abgerufen haben, können Sie sie an ViewModel
übergeben, wo Sie sie auf anderen Ebenen Ihrer Architektur verwenden können, um die anzuzeigenden Suchergebnisse abzurufen.