Suchoberfläche einrichten

Compose-Methode ausprobieren
Jetpack Compose ist das empfohlene UI-Toolkit für Android. Informationen zum Hinzufügen der Suchfunktion in Compose

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:

Ein Bild mit einem leeren Bildschirm und einem Suchsymbol in der oberen Leiste der App
Abbildung 1 Ein Suchsymbol in der oberen App-Leiste.

SearchView wird in der App-Leiste Ihrer App angezeigt, ist aber nicht funktionsfähig. Wenn Sie auf das Suchsymbol tippen, wird etwa Folgendes angezeigt:

Ein Bild, das die Suchansicht in Aktion zeigt
Abbildung 2 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.