Suchoberfläche einrichten

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

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:

Ein Bild, das einen leeren Bildschirm mit einem Suchsymbol in der oberen Leiste der App zeigt
Abbildung 1. Ein Suchsymbol in der oberen Leiste der App.

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:

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