Search Filter

header

Según la documentación de Google sobre Material Design:

La barra de la aplicación puede actuar como campo de entrada de texto. El contenido del listado se va filtrando y ordenando conforme el usuario escribe.

¿Cómo se añade?

I. En el archivo build.gradle añade la última versión de la librería appcompat.

dependencies {  
    compile 'com.android.support:appcompat-v7:X.X.X' // donde X.X.X especifica la versión
}

II. Define una configuración para elementos searchables en el fichero searchable.xml del directorio res/xml.

<?xml version="1.0" encoding="utf-8"?>  
<searchable xmlns:android="http://schemas.android.com/apk/res/android"  
    android:label="@string/app_label"
    android:hint="@string/search_hint" >
</searchable>  

III. Declara tu activity de búsqueda en el fichero AndroidManifest.xml.

<activity android:name=".SearchActivity">  
    <intent-filter>
        <action android:name="android.intent.action.SEARCH" />
    </intent-filter>
    <meta-data android:name="android.app.searchable"
               android:resource="@xml/searchable"/>
</activity>  

IV. Añade tu SearchView en cualquier layout.xml de cualquier activity.

<android.support.v7.widget.SearchView  
    android:id="@+id/search"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

V. Configura tu SearchView en el método onCreate de su activity correspondiente.

SearchView searchView = (SearchView) findViewById(R.id.search);  
// Sets searchable configuration defined in searchable.xml for this SearchView
SearchManager searchManager =  
        (SearchManager) getSystemService(Context.SEARCH_SERVICE);
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));  

VI. Recibe y maneja las búsquedas

// Cuando el usuario ejecuta una búsqueda el sistema lanza tu activity de búsqueda enviándole un intent tipo ACTION_SEARCH

Intent intent = getIntent();  
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {  
  String query = intent.getStringExtra(SearchManager.QUERY);
  doMySearch(query);
}

Escuchar acciones del usuario

Recibir el texto de búsqueda mientras el usuario lo va escribiendo te permite buscar y filtrar resultados más rápidamente.

searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {  
    @Override
    public boolean onQueryTextSubmit(String query) {
        searchFor(query);
        return true;
    }

    @Override
    public boolean onQueryTextChange(String query) {
        filterSearchFor(query);
        return true;
    }
});

¿Cómo modificar el estilo?

style

I. Declara tu estilo personalizado en el fichero styles.xml.

<style name="SearchViewTheme" >  
    <item name="colorControlActivated">@color/amber500</item>
    <item name="colorControlNormal">@color/green500</item>
</style>  

II. Aplica este estilo a tu SearchView mediante el atributo android:theme. Para cambiar el icono de búsqueda puedes utilizar el atributo app:searchIcon.

<android.support.v7.widget.SearchView  
    android:id="@+id/search"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:searchIcon="@drawable/ic_library"
    app:theme="@style/SearchViewTheme"/>

Ciclo de vida de la activity de búsqueda

  1. Si tu SearchView no está en la activity de búsqueda: cuando ocurre una búsqueda se desencadena el ciclo normal para las activities implicadas. Como resultado, la activity actual queda pausada y la activity de búsqueda se crea y pasa al frente.

  2. Si tu SearchView está en la activity de búsqueda, entonces ocurre una de estas dos cosas:

    1. Por defecto: la activity de búsqueda recibe una llamada a su método onCreate con un intent tipo ACTION_SEARCH. Esto provocará que se creen dos instancias de la activity de búsqueda (una sobre la otra).

    2. Si has definido android:launchMode como singleTop: la activity de búsqueda recibe una llamada a su método onNewIntent con un intent tipo ACTION_SEARCH. Esto evita que la activity sea duplicada.

¿Quieres saber más? Echa un vistazo a la información general de Google sobre búsquedas.