Suchoberfläche einrichten

Wir empfehlen die Verwendung des SearchView Widget als Element in der App-Leiste hinzufügen, um Suchfunktionen in Ihrer App bereitzustellen. Als Elemente in der App-Leiste auswählen, können Sie SearchView so definieren, immer oder nur dann ausgeliefert werden, wenn genügend Platz ist. Sie können sie auch als minimierbare Aktion, bei der das SearchView als Symbol angezeigt wird und nimmt dann die gesamte App-Leiste als Suchfeld ein, tippt auf das Symbol.

SearchView zur App-Leiste hinzufügen

Um der App-Leiste ein SearchView-Widget hinzuzufügen, erstellen Sie eine Datei in Ihrem Projekt mit dem Namen res/menu/options_menu.xml und fügen Sie den folgenden Code hinzu: hinzufügen. Dieser Code definiert, wie das Suchelement erstellt wird, z. B. das Symbol und den Titel des Artikels. Das Attribut collapseActionView können Sie Ihr SearchView so erweitern, dass es die gesamte App-Leiste einnimmt und und bei Nichtgebrauch wieder zu einem normalen App-Leistenelement minimiert werden. Aufgrund der ist der Platz in der App-Leiste auf Mobiltelefonen begrenzt, empfehlen wir die Verwendung der collapsibleActionView-Attribut für einen besseren Nutzer 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>
<ph type="x-smartling-placeholder">

Wenn Sie die Barrierefreiheit eines Suchsymbols verbessern möchten, erstellen Sie ein ic_search.xml-Datei im Ordner /res/drawable und den folgenden Code enthalten:

<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>

Maximieren Sie das XML-Menü, um SearchView in der App-Leiste anzuzeigen Ressource res/menu/options_menu.xml im onCreateOptionsMenu() Methode Ihrer Aktivität:

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:

<ph type="x-smartling-placeholder">
</ph> Ein Bild, das einen leeren Bildschirm mit einem Suchsymbol in der oberen App-Leiste zeigt <ph type="x-smartling-placeholder">
</ph> Abbildung 1: Ein Suchsymbol in der oberen Leiste der App.

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

<ph type="x-smartling-placeholder">
</ph> Ein Bild, das die Suchansicht in Aktion zeigt <ph type="x-smartling-placeholder">
</ph> Abbildung 2: SearchView in Aktion.

Damit SearchView funktioniert, müssen Sie definieren, wie die SearchView verhält.

Suchkonfiguration erstellen

Eine Suche Konfiguration gibt an, wie sich SearchView verhält und res/xml/searchable.xml-Datei definiert ist. Eine Suchkonfiguration muss mindestens ein android:label-Attribut enthalten, das den android:label-Attribut des <Anwendung> oder <activity> -Element in Ihrem Android-Manifest. Es empfiehlt sich jedoch auch, android:hint-Attribut, damit der Nutzer weiß, was er eingeben muss in das Suchfeld ein.

<?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 die -Element in einem <activity>, in dem das Element angezeigt werden soll SearchView.

<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() der Suchkonfiguration mit SearchView durch Aufrufen von setSearchableInfo(SearchableInfo):

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 an getSearchableInfo() erhält ein SearchableInfo -Objekt, das aus der XML-Datei für die Suchkonfiguration erstellt wird. Wenn die Suchanfrage Konfiguration ist korrekt mit SearchView und dem der Nutzer eine Anfrage sendet, startet SearchView eine Aktivität mit dem ACTION_SEARCH die Nutzerabsicht verstehen. Sie benötigen dann eine Aktivität, die nach diesem Intent filtern und den Suchanfrage.

Suchbare Aktivität erstellen

Eine suchbare Aktivität filtert nach dem Intent ACTION_SEARCH und nach der Abfrage in einem Dataset sucht. Um eine durchsuchbare Aktivität zu erstellen, Eine Aktivität Ihrer Wahl, um nach ACTION_SEARCH zu filtern Intent:

<activity android:name=".SearchResultsActivity" ... >
    ...
    <intent-filter>
        <action android:name="android.intent.action.SEARCH" />
    </intent-filter>
    ...
</activity>

Verarbeiten Sie in Ihren suchbaren Aktivitäten den Intent ACTION_SEARCH wie folgt: in Ihrem onCreate() .

<ph type="x-smartling-placeholder">

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 Anfrage des Nutzers annehmen und Ihren durchsuchbare Aktivität mit dem Intent ACTION_SEARCH.

Nachdem Sie die Suchanfrage erhalten haben, können Sie sie an die ViewModel, wo Sie sie auch in anderen Ebenen Ihres Architektur zum Abrufen der anzuzeigenden Suchergebnisse.