Wir empfehlen, das
SearchView
Widget als Element in der App-Leiste zu verwenden, um die Suchfunktion in Ihrer App bereitzustellen. Wie
bei allen Elementen in der App-Leiste können Sie das SearchView so definieren, dass es
immer oder nur dann angezeigt wird, wenn Platz vorhanden ist. Sie können es auch als minimierbare Aktion definieren, bei der 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. Dieser Code definiert, wie das Suchelement erstellt wird, z. B. das zu verwendende Symbol und der Titel des Elements. Mit dem Attribut collapseActionView kann SearchView erweitert werden, um die gesamte App-Leiste einzunehmen, und wieder minimiert werden, wenn es nicht verwendet wird. Aufgrund des begrenzten Platzes in der App-Leiste auf Mobilgeräten 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 besser zugängliches Suchsymbol möchten, erstellen Sie eine ic_search.xml-Datei im Ordner /res/drawable 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 SearchView in der App-Leiste anzeigen möchten, blähen 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 }
Wenn Sie die App ausführen, wird etwa Folgendes generiert:
SearchView wird in der App-Leiste Ihrer App angezeigt, ist aber nicht funktionsfähig. Wenn Sie auf das Suchsymbol tippen, wird etwa Folgendes angezeigt:
SearchView in Aktion.
Damit SearchView funktioniert, müssen Sie definieren, wie es sich verhält.SearchView
Suchkonfiguration erstellen
In einer Such
konfiguration wird festgelegt, wie sich SearchView verhält. Sie wird
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
<application>
oder <activity>
Elements in Ihrem Android-Manifest hat. Wir empfehlen jedoch auch, ein android:hint-Attribut hinzuzufügen, damit der Nutzer weiß, was er in das Suchfeld eingeben soll.
<?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 einer <activity>, in der 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>
Ordnen Sie in der von Ihnen erstellten Methode onCreateOptionsMenu() die Suchkonfiguration 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 }
Der Aufruf von
getSearchableInfo()
ruft ein
SearchableInfo
Objekt ab, das aus der XML-Datei der Suchkonfiguration erstellt wurde. Wenn die Suchkonfiguration korrekt mit SearchView verknüpft ist und der Nutzer eine Abfrage sendet, startet SearchView eine Aktivität mit der Intent ACTION_SEARCH. Sie benötigen dann eine Aktivität, die nach dieser Intent filtern und die Suchanfrage verarbeiten kann.
Suchaktivität erstellen
Eine Suchaktivität filtert nach der Intent ACTION_SEARCH und sucht in einem Datensatz nach der Abfrage. Wenn Sie eine Suchaktivität erstellen möchten, deklarieren Sie eine Aktivität Ihrer Wahl, um nach der Intent ACTION_SEARCH zu filtern:
<activity android:name=".SearchResultsActivity" ... > ... <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> ... </activity>
Verarbeiten Sie in Ihrer Suchaktivität die 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 SearchView die Abfrage des Nutzers akzeptieren und Ihre Suchaktivität mit der Intent ACTION_SEARCH starten.
Nachdem Sie die Suchanfrage erhalten haben, können Sie sie an das ViewModel übergeben, wo Sie sie in anderen Ebenen Ihrer Architektur verwenden können, um die anzuzeigenden Suchergebnisse abzurufen.