Nous vous recommandons d'utiliser
SearchView
en tant qu'élément de la barre d'application pour fournir une fonctionnalité de recherche dans votre application. En tant que
avec tous les éléments dans la barre d'application, vous pouvez définir SearchView
sur
s'affichent en permanence ou uniquement lorsqu'il y a de la place. Vous pouvez également la définir
action réductible, qui affiche SearchView
sous forme d'icône
qui occupe la totalité de la barre d'application comme champ de recherche
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
du projet nommé res/menu/options_menu.xml
et ajoutez le code suivant :
au fichier. Ce code définit la façon de créer l'élément de recherche, comme l'icône
et le titre de l'article. Attribut collapseActionView
permet à votre SearchView
de se développer pour occuper la totalité de la barre d'application.
se réduit à un élément de barre d'application normal lorsqu'il n'est pas utilisé. Grâce au
espace limité dans la barre d'application sur les téléphones, nous vous recommandons d'utiliser
Attribut collapsibleActionView
pour proposer un meilleur profil utilisateur
expérience.
<?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 une
ic_search.xml
dans le dossier /res/drawable
et
incluez 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 le menu XML
la ressource res/menu/options_menu.xml
dans
onCreateOptionsMenu()
méthode 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:
Le SearchView
apparaît dans la barre d'application de votre application, mais pas
et fonctionnel. Si vous appuyez sur l'icône de recherche, vous obtenez quelque chose comme ceci:
Pour rendre le SearchView
fonctionnel, vous devez définir la manière dont
Comportement de SearchView
.
Créer une configuration de recherche
Une recherche
configuration spécifie le comportement de SearchView
et est
défini dans un fichier res/xml/searchable.xml
. Une configuration de recherche
doit contenir au moins un attribut android:label
ayant l'attribut
la même valeur que celle de l'attribut android:label
<application>
ou <activity>
dans votre fichier manifeste Android. Toutefois, nous vous recommandons également d'ajouter
Attribut android:hint
pour indiquer à l'utilisateur 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
<meta-data>
qui pointe vers le fichier res/xml/searchable.xml
. Déclarez le
d'un élément <activity>
dans lequel vous souhaitez afficher le
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 avec 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 à
getSearchableInfo()
obtient une valeur
SearchableInfo
créé à partir du fichier XML de configuration de la recherche. Lorsque la recherche
est correctement associée à votre SearchView
et
l'utilisateur envoie une requête, le SearchView
démarre une activité avec
ACTION_SEARCH
l'intention. Vous avez ensuite besoin d'une activité capable de filtrer cet intent et de gérer
requête de recherche.
Créer une activité avec recherche
Des filtres d'activité avec recherche pour l'intent ACTION_SEARCH
et
pour rechercher la requête
dans un ensemble de données. Pour créer une activité interrogeable, déclarez
Une activité de votre choix pour filtrer les ACTION_SEARCH
intent:
<activity android:name=".SearchResultsActivity" ... > ... <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> ... </activity>
Dans votre activité interrogeable, gérez l'intent ACTION_SEARCH
en procédant comme suit :
en vérifiant dans votre
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") } } }
SearchView
peut maintenant accepter la requête de l'utilisateur et démarrer votre
activité de recherche avec l'intent ACTION_SEARCH
.
Une fois la requête de recherche obtenue, vous pouvez la transmettre à la fonction
ViewModel
, qui vous permet de l'utiliser dans d'autres couches de votre
pour récupérer les résultats de recherche à afficher.