Configurer l'interface de recherche

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>
<ph type="x-smartling-placeholder">

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:

Image montrant un écran vide avec une icône de recherche dans la barre supérieure de l&#39;application
Figure 1 : Une icône de recherche dans la barre supérieure de l'application

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:

Image illustrant la vue de recherche en action
Figure 2 : SearchView en action.

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() .

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

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.