Rétrocompatibilité restant

Le SearchView et la barre d'action ne sont disponibles que sur Android 3.0 et plus tard. Pour assurer la compatibilité avec d'anciennes plates-formes, vous pouvez revenir à la boîte de dialogue de recherche. La boîte de dialogue de recherche fournie par le système qui se superpose à votre application lorsqu'elle est appelée.

Définir les niveaux d'API minimal et cible

Pour configurer la boîte de dialogue de recherche, déclarez d'abord dans votre fichier manifeste que vous souhaitez prendre en charge mais que vous souhaitez cibler Android 3.0 ou version ultérieure. Dans ce cas, votre application utilise automatiquement la barre d'action sur Android 3.0 ou version ultérieure et utilise le système de menu traditionnel appareils plus anciens:

<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="15" />

<application>
...

Fournir la boîte de dialogue de recherche pour les appareils plus anciens

Pour ouvrir la boîte de dialogue de recherche sur des appareils plus anciens, appelez onSearchRequested() chaque fois qu'un utilisateur sélectionne la recherche dans le menu d'options. Étant donné que les appareils Android 3.0 et versions ultérieures affichent le SearchView dans la barre d'action (comme illustré dans la première leçon), uniquement les versions versions antérieures à la version 3.0, appellent onOptionsItemSelected() lorsque la classe l'utilisateur sélectionne l'élément du menu de recherche.

Kotlin

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    return when (item.itemId) {
        R.id.search -> {
            onSearchRequested()
            true
        }
        else -> false
    }
}

Java

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.search:
            onSearchRequested();
            return true;
        default:
            return false;
    }
}

Vérifier la version du build Android au moment de l'exécution

Au moment de l'exécution, vérifiez la version de l'appareil pour vous assurer qu'aucune utilisation non compatible de SearchView ne se produit sur les appareils plus anciens. Dans notre exemple de code, cela se produit la méthode onCreateOptionsMenu():

Kotlin

override fun onCreateOptionsMenu(menu: Menu): Boolean {

    menuInflater.inflate(R.menu.options_menu, menu)

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager
        (menu.findItem(R.id.search).actionView as SearchView).apply {
            setSearchableInfo(searchManager.getSearchableInfo(componentName))
            setIconifiedByDefault(false)
        }
    }
    return true
}

Java

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.options_menu, menu);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        SearchManager searchManager =
                (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        SearchView searchView =
                (SearchView) menu.findItem(R.id.search).getActionView();
        searchView.setSearchableInfo(
                searchManager.getSearchableInfo(getComponentName()));
        searchView.setIconifiedByDefault(false);
    }
    return true;
}