Configurare l'interfaccia di ricerca

Ti consigliamo di utilizzare SearchView widget come elemento nella barra delle app per fornire la funzionalità di ricerca nella tua app. Come con tutti gli elementi nella barra delle app, puoi definire SearchView vengono mostrati sempre o solo quando c'è spazio. Puoi anche definire azione comprimibile, che mostra il SearchView sotto forma di icona per poi occupare l'intera barra delle app come campo di ricerca quando l'utente tocca l'icona.

Aggiungi SearchView alla barra delle app

Per aggiungere un widget SearchView alla barra delle app, crea un file nel tuo progetto denominato res/menu/options_menu.xml e aggiungi il codice seguente al file. Questo codice definisce come creare l'elemento di ricerca, ad esempio l'icona e il titolo dell'articolo. Attributo collapseActionView consente a SearchView di espandersi per occupare l'intera barra delle app e comprimi di nuovo verso il basso in un normale elemento della barra dell'app quando non in uso. A causa dei spazio limitato nella barra delle app sui telefoni, ti consigliamo di utilizzare Attributo collapsibleActionView per fornire un utente migliore un'esperienza senza intervento manuale.

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

Se vuoi un'icona di ricerca più accessibile, crea un'opzione ic_search.xml file nella cartella /res/drawable e includi il seguente codice:

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

Per visualizzare SearchView nella barra delle app, gonfia il menu XML risorsa res/menu/options_menu.xml nel onCreateOptionsMenu() metodo della tua attività:

Kotlin

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    menuInflater.inflate(R.menu.options_menu, menu)

    return true
}

L'esecuzione dell'app genera qualcosa di simile a questo:

Un&#39;immagine che mostra una schermata vuota con un&#39;icona di ricerca nella barra superiore dell&#39;app
. Figura 1. Un'icona di ricerca nella barra superiore dell'app.

Il SearchView viene visualizzato nella barra delle app dell'app, ma non lo è funzionale. Se tocchi l'icona di ricerca, vedrai qualcosa di simile a questo:

Un&#39;immagine che mostra la visualizzazione Ricerca in azione
. Figura 2. SearchView in azione.

Per rendere funzionale SearchView, devi definire in che modo SearchView si comporta.

Crea una configurazione di ricerca

Una ricerca personalizzata specifica il comportamento dell'elemento SearchView definito in un file res/xml/searchable.xml. Una configurazione di ricerca deve contenere almeno un attributo android:label con stesso valore dell'attributo android:label dell' <applicazione> o <activity> nel tuo file manifest Android. Tuttavia, ti consigliamo anche di aggiungere Attributo android:hint per dare all'utente un'idea di cosa inserire nella casella di ricerca.

<?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" />

Nel file manifest dell'app, dichiara <meta-data> che rimanda al file res/xml/searchable.xml. Dichiara il in <activity> in cui vuoi visualizzare gli elementi 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>

Nel metodo onCreateOptionsMenu() che crei, associa la configurazione di ricerca con SearchView richiamando 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
}

La chiamata a getSearchableInfo() ottiene un SearchableInfo creato dal file XML di configurazione della ricerca. Quando la ricerca sia correttamente associata a SearchView e invia una query, SearchView avvia un'attività ACTION_SEARCH l'intento. Hai quindi bisogno di un'attività che possa filtrare in base a questo intent e gestire query di ricerca.

Creare un'attività disponibile per la ricerca

Un filtro attività disponibile per la ricerca per l'intent ACTION_SEARCH e cerca la query in un set di dati. Per creare un'attività disponibile per la ricerca, dichiara un'attività a tua scelta per filtrare ACTION_SEARCH intent:

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

Nella tua attività di ricerca, gestisci l'intent ACTION_SEARCH in base a e verificarlo nel tuo onCreate() .

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")
        }
    }
}

Ora il SearchView può accettare la query dell'utente e avviare la attività disponibile per la ricerca con l'intento ACTION_SEARCH.

Dopo aver ottenuto la query di ricerca, puoi passarla ViewModel, dove puoi utilizzarlo in altri livelli del tuo per recuperare i risultati di ricerca da visualizzare.