Cómo mantener la retrocompatibilidad

El SearchView y la barra de acciones solo están disponibles en Android 3.0 y más adelante. Si quieres admitir versiones anteriores de la plataforma, puedes recurrir al diálogo de búsqueda. El diálogo de búsqueda es un IU proporcionada por el sistema que se superpone sobre tu aplicación cuando se invoca.

Cómo configurar los niveles de API mínimo y objetivo

Para configurar el diálogo de búsqueda, primero declara en tu manifiesto que deseas admitir pero que desee orientar a Android 3.0 o versiones posteriores. Cuando haces esto, tu aplicación utiliza automáticamente la barra de acciones en Android 3.0 o versiones posteriores y usa el sistema de menú tradicional en Dispositivos más antiguos:

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

<application>
...

Cómo proporcionar el diálogo de búsqueda en dispositivos más antiguos

Para invocar el diálogo de búsqueda en dispositivos más antiguos, llama a onSearchRequested() cada vez que un usuario seleccione la búsqueda. elemento del menú de opciones. Dado que los dispositivos con Android 3.0 y versiones posteriores muestran la versión SearchView en la barra de acciones (como se muestra en la primera lección); solo versiones anterior a 3.0 llama a onOptionsItemSelected() cuando la el usuario selecciona el elemento del menú de búsqueda.

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;
    }
}

Cómo comprobar la versión de compilación de Android en el tiempo de ejecución

En el tiempo de ejecución, comprueba la versión del dispositivo a fin de asegurarte de que no haya problemas de compatibilidad con la SearchView en dispositivos más antiguos. En nuestro código de ejemplo, esto sucede en el método 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;
}