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