Suchoberfläche einrichten

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:

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

Das SearchView wird in der App-Leiste Ihrer App angezeigt, funktioniert aber nicht. Wenn du auf das Suchsymbol tippst, wird etwa Folgendes angezeigt:

Ein Bild, das die Suchansicht in Aktion zeigt
Abbildung 2. SearchView in Aktion.

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.