Crea una API REST con Node.js y MongoDB

En este curso vas a aprender a crear una API REST con Node.js y MongoDB, además de crear un entorno de desarrollo con Docker y Docker Compose.

Comenzar ahora
MaterialSearchView Me encontraba hace unos días desarrollando un pequeño ejemplo para probar un par de tonterías en Android cuando me topé con la necesidad de utilizar un SearchView, lo que viene siendo una barra de búsquedas. Después de repasar las guías de diseño de Material Design y las herramientas disponibles en el SDK, me di cuenta de que no era suficiente para lo que necesitaba realizar. Por esto, comencé la búsqueda de una librería de terceros que me hiciera el apaño. Cual fue mi sorpresa de no encontrar nada decente al respecto, por lo que opté por desarrollar la mía propia, y esto es MaterialSearchView.

¿Qué es MaterialSearchView?

Es simplemente una pequeña, y espero que sencilla a la vez que practica, librería para implementar un SearchView con aspecto Material Design.

¿Cómo funciona?

Antes de nada añadimos las dependencias:
dependencies {
    compile 'com.miguelcatalan:materialsearchview:1.0.0'
}
MaterialSearchView funciona junto a Toolbar por lo que deberemos definir ambos en nuestro layout. Es importante que este conjunto se encuentre al final de nuestra view.
<!— Must be last for right layering display —>
<RelativeLayout
    android:id="@+id/toolbar_container"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="@color/theme_primary" />

    <com.miguelcatalan.materialsearchview.MaterialSearchView
        android:id="@+id/search_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</RelativeLayout>
Añadimos el elemento al menu:
<item
    android:id="@+id/action_search"
    android:icon="@drawable/ic_action_action_search"
    android:orderInCategory="100"
    android:title="@string/abc_search_hint"
    app:showAsAction="always" />
Y finalmente lo enlazamos en nuestra clase, donde podremos recibir la respuesta de los listeners:
MaterialSearchView searchView = (MaterialSearchView) findViewById(R.id.search_view);
searchView.setOnQueryTextListener(new MaterialSearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            //Do some magic
            return false;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            //Do some magic
            return false;
        }
    });

    searchView.setOnSearchViewListener(new MaterialSearchView.SearchViewListener() {
        @Override
        public void onSearchViewShown() {
            //Do some magic
        }

        @Override
        public void onSearchViewClosed() {
            //Do some magic
        }
    });
Realmente con esto sería suficiente, pero aún tenemos más funcionalidades muy útiles.

Búsqueda por voz

Para habilitarla utilizaremos lo siguiente:
searchView.setVoiceSearch(true); //or false
Y recibiremos la respuesta con:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == MaterialSearchView.REQUEST_VOICE && resultCode == RESULT_OK) {
        ArrayList<String> matches = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
        if (matches != null && matches.size() > 0) {
            String searchWrd = matches.get(0);
            if (!TextUtils.isEmpty(searchWrd)) {
                searchView.setQuery(searchWrd, false);
            }
        }

        return;
    }
    super.onActivityResult(requestCode, resultCode, data);
}

Añadir sugerencias

Podemos hacer que mientas escribimos nos aparezca una serie de sugerencias. Para ello, definiremos las sugerencias como un string-array:
<string-array name="query_suggestions">
    <item>Android</item>
    <item>iOS</item>
    <item>SCALA</item>
    <item>Ruby</item>
    <item>JavaScript</item>
</string-array>
Y lo añadiremos a nuestro objeto:
searchView.setSuggestions(getResources().getStringArray(R.array.query_suggestions));

Define tu propio estilo

Para gustos, colores, por esto puedes definir tu propio estilo con estos parámetros:
<style name="MaterialSearchViewStyle">
    <!— Background for the search bar—>
    <item name="searchBackground">@color/theme_primary</item>

    <!— Change voice icon—>
    <item name="searchVoiceIcon">@drawable/ic_action_voice_search_inverted</item>

    <!— Change clear text icon—>
    <item name="searchCloseIcon">@drawable/ic_action_navigation_close_inverted</item>

    <!— Change up icon—>
    <item name="searchBackIcon">@drawable/ic_action_navigation_arrow_back_inverted</item>

    <!— Change background for the suggestions list view—>
    <item name="searchSuggestionBackground">@android:color/white</item>

    <!— Change text color for edit text. This will also be the color of the cursor—>
    <item name="android:textColor">@color/theme_primary_text_inverted</item>

    <!— Change hint text color for edit text—>
    <item name="android:textColorHint">@color/theme_secondary_text_inverted</item>

    <!— Hint for edit text—>
    <item name="android:hint">@string/search_hint</item>
</style>

Ejemplo

Si queréis ver más detenidamente como se comporta esta librería, he publicado un ejemplo en Google Play. Get it on Google Play Si os ha gustado no olvidéis en dar una estrella en el repositorio y compartidla para que más gente disfrute de esta utilidad.

¿Quieres seguir aprendiendo?