Cómo mantener la retrocompatibilidad

El elemento 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 la app.

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

Para configurar el diálogo de búsqueda, primero debes declarar en tu manifiesto que quieres admitir dispositivos más antiguos, pero deseas orientar tu app a Android 3.0 o versiones posteriores. Cuando lo hagas, tu app 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() cuando un usuario seleccione el elemento de menú de búsqueda en las opciones del menú. Como los dispositivos que ejecutan Android 3.0 y versiones posteriores muestran la SearchView en la barra de acciones (como se muestra en la primera lección), solo las versiones posteriores 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;
    }