Cómo mantener la retrocompatibilidad

El SearchView y la barra de acciones solo están disponibles en Android 3.0 y versiones posteriores. Si quieres admitir versiones anteriores de la plataforma, puedes recurrir al diálogo de búsqueda. Este es una IU proporcionada por el sistema que, cuando se invoca, se superpone en la parte superior de tu app.

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 dispositivos más antiguos, pero que quieres orientar a Android 3.0 o versiones posteriores. Cuando lo hagas, tu aplicación usará automáticamente la barra de acciones en Android 3.0 o versiones posteriores y 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 el elemento de menú de búsqueda en las opciones del menú. Debido a que los dispositivos con Android 3.0 y versiones posteriores muestran el SearchView en la barra de acciones (como se muestra en la primera lección), solo las versiones anteriores a la 3.0 llaman a onOptionsItemSelected() cuando el usuario selecciona el elemento de 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, sucede lo siguiente 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;
}