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