Rétrocompatibilité restant

SearchView et la barre d'action ne sont disponibles que sur Android 3.0 ou version ultérieure. 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 est une interface utilisateur fournie par le système qui se superpose à votre application lorsqu'elle est appelée.

Définir les niveaux d'API minimaux et cibles

Pour configurer la boîte de dialogue de recherche, commencez par indiquer dans votre fichier manifeste que vous souhaitez prendre en charge les appareils plus anciens, mais que vous voulez 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 menus traditionnel sur les 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 appeler la boîte de dialogue de recherche sur des appareils plus anciens, appelez onSearchRequested() chaque fois qu'un utilisateur sélectionne l'élément de menu de recherche dans le menu d'options. Étant donné que les appareils Android 3.0 et versions ultérieures affichent SearchView dans la barre d'action (comme illustré dans la première leçon), seules les versions antérieures à 3.0 appellent onOptionsItemSelected() lorsque 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 de build Android au moment de l'exécution

Au moment de l'exécution, vérifiez la version de l'appareil pour vous assurer que l'utilisation de SearchView n'est pas compatible avec les appareils plus anciens. Dans notre exemple de code, cela se produit dans 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;
}