Nous vous recommandons d'utiliser le widget SearchView
en tant qu'élément dans la barre d'application pour fournir une fonctionnalité de recherche dans votre application. Comme pour tous les éléments de la barre d'application, vous pouvez définir SearchView
pour qu'il s'affiche en permanence ou uniquement si l'espace disponible est suffisant. Vous pouvez également la définir comme une action réductible, ce qui affiche initialement SearchView
sous la forme d'une icône, puis occupe l'intégralité de la barre d'application comme champ de recherche lorsque l'utilisateur appuie sur l'icône.
Ajouter SearchView à la barre d'application
Pour ajouter un widget SearchView
à la barre d'application, créez un fichier dans votre projet nommé res/menu/options_menu.xml
et ajoutez le code suivant au fichier. Ce code définit comment créer l'élément de recherche, par exemple l'icône à utiliser et le titre de l'élément. L'attribut collapseActionView
permet à votre SearchView
de se développer pour occuper toute la barre d'application et de se réduire dans un élément de barre d'application normal lorsqu'il n'est pas utilisé. En raison de l'espace limité de la barre d'application sur les téléphones, nous vous recommandons d'utiliser l'attribut collapsibleActionView
pour offrir une meilleure expérience utilisateur.
<?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>
Si vous souhaitez une icône de recherche plus accessible, créez un fichier ic_search.xml
dans le dossier /res/drawable
et incluez-y le code suivant:
<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>
Pour afficher SearchView
dans la barre d'application, gonflez la ressource de menu XML res/menu/options_menu.xml
dans la méthode onCreateOptionsMenu()
de votre activité:
Kotlin
override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.options_menu, menu) return true }
L'exécution de l'application génère un résultat semblable à celui-ci:
![Image montrant un écran vide avec une icône de recherche dans la barre supérieure de l'application](https://developer.android.com/static/images/ui/searchview_1.png?authuser=5&hl=fr)
Le SearchView
s'affiche dans la barre d'application de votre application, mais il ne fonctionne pas. Si vous appuyez sur l'icône de recherche, vous obtenez un résultat semblable à celui-ci:
![Image montrant l'affichage de la recherche en action](https://developer.android.com/static/images/ui/searchview_2.png?authuser=5&hl=fr)
SearchView
en action.
Pour rendre SearchView
fonctionnel, vous devez définir son comportement.SearchView
Créer une configuration de recherche
Une configuration de recherche spécifie le comportement de SearchView
et est définie dans un fichier res/xml/searchable.xml
. Une configuration de recherche doit contenir au minimum un attribut android:label
ayant la même valeur que l'attribut android:label
de l'élément <application> ou <activity> de votre fichier manifeste Android. Toutefois, nous vous recommandons également d'ajouter un attribut android:hint
pour donner à l'utilisateur une idée de ce qu'il doit saisir dans le champ de recherche.
<?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" />
Dans le fichier manifeste de votre application, déclarez un élément <meta-data>
qui pointe vers le fichier res/xml/searchable.xml
. Déclarez l'élément dans un <activity>
dans lequel vous souhaitez afficher l'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>
Dans la méthode onCreateOptionsMenu()
que vous créez, associez la configuration de recherche à SearchView
en appelant 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 }
L'appel de getSearchableInfo()
obtient un objet SearchableInfo
créé à partir du fichier XML de configuration de recherche. Lorsque la configuration de recherche est correctement associée à votre SearchView
et que l'utilisateur envoie une requête, SearchView
lance une activité avec l'intent ACTION_SEARCH
. Vous avez ensuite besoin d'une activité capable de filtrer cet intent et de gérer la requête de recherche.
Créer une activité incluse dans l'index de recherche
Une activité incluse dans l'index de recherche filtre l'intent ACTION_SEARCH
et recherche la requête dans un ensemble de données. Pour créer une activité interrogeable, déclarez une activité de votre choix afin de filtrer l'intent ACTION_SEARCH
:
<activity android:name=".SearchResultsActivity" ... > ... <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> ... </activity>
Dans votre activité consultable, gérez l'intent ACTION_SEARCH
en le recherchant dans votre méthode 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") } } }
Désormais, SearchView
peut accepter la requête de l'utilisateur et démarrer votre activité d'index de recherche avec l'intent ACTION_SEARCH
.
Une fois la requête de recherche obtenue, vous pouvez la transmettre à ViewModel
, où vous pouvez l'utiliser dans d'autres couches de votre architecture pour récupérer les résultats de recherche à afficher.