Android/Search
La cerca és una funció fonamental en Android: els usuaris han de poder cercar qualsevol classe d'informació de la qual disposin, independentment de si el contingut es troba al seu dispositiu o bé a la xarxa. Per ajudar a crear una experiència de cerca consistent pels usuaris, Android proporciona un framework de cerca que ajuda a implementar la cerca en una aplicació.
Configuració de cerca
[modifica]El primer que cal és un fitxer XML conegut com a configuració de cerca. Aquest fitxer configura aspectes de la UI del diàleg de cerca o del widget de cerca, i defineix com es comporten algunes funcions, per exemple, els suggeriments. Habitualment aquest fitxer se l'anomena searchable.xml i es guarda al directori del projecte res/xml/. El fitxer de configuració ha d'incloure l'element <searchable> com arrel i especificar un o més atributs. Per exemple:
- Link al repositori: [1]
- Anotacions: Aquest fitxer és searchable.xml
- Vegeu també: No
<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:label="@string/nom_aplicacio"
android:hint="@string/introdueix_cerca" >
</searchable>
Hi ha un atribut que s'ha d'afegir sempre, l'android:label, apunta a un recurs string, que hauria de ser el nom de l'aplicació. En aquest punt, aquesta etiqueta és visible a la llista d’elements cercables a la configuració del sistema. No és visible per a l'usuari fins que no s'activen els suggeriments de cerca del quadre de cerca ràpida. De moment, aquests atributs són suficients, s'afegeixen més quan s'afegeixen funcions com els suggeriments de cerca.
Creació de l'activitat de cerca
[modifica]Hem de crear una activitat de cerca, és una Activity de l'aplicació que efectuarà les cerques i presentarà els resultats de la cerca. De moment, no es crea la funcionalitat de cerca, creem l'Activity i la declarem al manifest.
Dins del manifest hem de:
1. Especificar la configuració de cerca que utilitzarem dins d'un element <meta-data>.
2. Declaració de l'activitat acceptant l'intent ACTION_SEARCH, en un element <intent-filter>.
Nota : L'element <meta-data> ha d'incloure l'atribut android:name amb el valor android.app.searchable i l'atribut android:resource amb una referència al nostre arxiu de configuració de cerca.
- Link al repositori: Pàgina principal d'Android
- Anotacions: Aquest fragment de codi es troba a /AndroidManifest.xml
- Vegeu també: No
<application ... >
//Declaració Activity acceptant intent ACTION_SEARCH
<activity android:name=".RealitzaCerca" >
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
//Especificació configuració de cerca
<meta-data android:name="android.app.searchable"
android:resource="@xml/searchable"/>
</activity>
...
</application>
Realització de la cerca
[modifica]S'ha de tenir l'Activity declarada al manifest. La realització d'una cerca requereix tres passos: recepció de la consulta, cerca de les dades i presentació dels resultats.
Recepció de la consulta
[modifica]Aquest pas esdevé quan un usuari executa una cerca al diàleg de cerca o widget, s'inicia la nostra activitat de cerca i li envia l'intent ACTION_SEARCH. Aquest intent conté la consulta en l'argument string extra QUERY 1 . Quan s'inicia l'activitat s'ha d'extraure aquest string.
Com rebre la consulta de cerca quan s'inicia l'activitat de cerca:
- Link al repositori: Pàgina principal d'Android
- Anotacions: Aquest fragment de codi es troba al fitxer /java/search_activity.java
- Vegeu també: No
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.search);
// Agafa l'intent, verifica l'acció i agafa la QUERY
Intent intent = getIntent();
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
String query = intent.getStringExtra(SearchManager.QUERY);
doMySearch(query);
}
}
1 QUERY : sempre va incluida amb l'intent ACTION_SEARCH.
Emmagatzament i cerca de les dades
[modifica]Cada aplicació emmagatzema i cerca les dades de manera exclusiva, és a dir, de maneres diferents.
Per exemple, a l'hora d'emmagatzemar dades es pot fer en una base de dades en línia, una base de dades SQLite local o fins i tot un arxiu de text.
Presentació dels resultats
[modifica]Independentment d'on estiguin emmagatzemades i com es busquin les dades, es recomana que s'utilitzi un Adapter per a poder presentar els resultats de la cerca a una ListView.
Interfície de cerca
[modifica]Introducció
[modifica]El framework de cerca ofereix dos tipus de cerca diferents: un diàleg de cerca a la part superior de la pantalla, o un widget que es pot incorporar al disseny de l'activitat. En qualsevol dels dos casos, Android assistirà la implementació enviant les consultes de cerca a una activitat especifica que realitza cerques. També es pot habilitar el diàleg de cerca o el widget per proporcionar suggeriments a mesura que l'usuari escriu.
El framework de cerca no ens proporciona cap API per cercar el contingut. Si per exemple, les dades que volem consultar es troben emmagatzemades a una base de dades SQLite, hauríem de fer servir la API android.database.sqlite per fer les nostres cerques.
Ús del diàleg de cerca
[modifica]El diàleg de cerca proporciona un quadre de cerca flotant a la part superior de la pantalla. El diàleg de cerca pot proporcionar suggeriments de cerca mentre que l'usuari escriu. Quan l’usuari executa la cerca, el sistema envia la consulta de cerca a una activitat especifica que realitza la cerca.
El diàleg de cerca és sempre ocult de manera predeterminada, fins que l’usuari l’activa. L'aplicació pot activar el diàleg de cerca amb el mètode onSearchRequested(). Tot i això, aquest mètode no funciona fins que no s'activa el diàleg de cerca de l’activitat. Per habilitar el diàleg de cerca, s'had’indicar al sistema quina és l'activitat especifica que ha de rebre les consultes de cerca des del diàleg de cerca, per tal de realitzar les cerques.
En l'exemple anterior en el qual creàvem una activitat de cerca (RealitzaCerca), podríem crear una altra activitat, anomenada Activitat en la qual mostraríem el diàleg de cerca i entregaria les consultes a l'activitat RealitzaCerca. Caldrà indicar-ho al manifest que l'activitat RealitzaCerca és l'activitat especifica, que referenciàvem anteriorment, que realitzarà les consultes del diàleg de cerca de l'activitat Activitat.
Per declarar una activitat de cerca per a un diàleg de cerca, d'una altra activitat, cal afegir l'element <meta-data> a dins de l'element <activity> de l'activitat respectiva. L'element <meta-data> ha d'incloure l'atribut android::value, que especifica el nom de la classe de l'activitat de cerca, i l'atribut android::name amb el valor igual android.app.default_searchable.
- Link al repositori: [2]
- Anotacions: No
- Vegeu també: No
<application ... >
<!-- Aquesta és l'activitat de cerca, és la que realitza les consultes de cerca -->
<activity android:name=".RealitzaCerca" >
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
<meta-data android:name="android.app.searchable"
android:resource="@xml/searchable"/>
</activity>
<!-- Aquesta activitat habilita el diàleg de cerca per poder iniciar cerques a la CercaActivitat -->
<activity android:name=".Activitat" ... >
<!-- habilita el diàleg de cerca per poder enviar les cerques a la CercaActivitat -->
<meta-data android:name="android.app.default_searchable"
android:value=".RealitzaCerca" />
</activity>
...
</application>
Com que l'activitat Activitat ara inclou un element <meta-data> per declarar quina és l'activitat per fer les cerques, el diàleg de cerca ara es troba habilitat. Cal tenir en compte, que la mateixa activitat de cerca proporciona el diàleg de cerca predeterminadament, per tant, no cal afegir aquesta declaració a l'activitat RealitzaCerca.
Quan l'usuari es troba en aquesta activitat, el mètode onSearchRequested() activa el diàleg de cerca. Quan l'usuari executa la cerca, el sistema inicia l'activitat RealitzaCerca i proporciona l'intent ACTION_SEARCH.
Si el que es vol, és que totes les activitats de l'aplicació proporcionin el diàleg de cerca, l'element <meta-data> cal inserir-lo com a fill de l'element <application>, en lloc de declarar-ho a cada activitat. D'aquesta manera totes les activitats hereten el valor, i entreguen totes les consultes de cerca a la mateixa activitat de cerca. Amb el diàleg de cerca ja habilitat per totes les activitats, l'aplicació està preparada per realitzar les cerques.
Quan s'utilitza el diàleg de cerca, cal proporcionar un botó de cerca a la nostra UI que activa el diàleg de cerca cridant a onSearchRequested(). També es pot habilitar la funcionalitat "escriure per buscar", activa el diàleg de cerca quan l'usuari comença a teclejar, a mesura que escriu, es va inserint al diàleg de cerca. Per habilitar aquesta funcionalitat dins de l'activitat cal cridar a setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL) durant el mètode onCreate() de l'activitat.
Ús del widget de cerca
[modifica]Aquest widget és el SearchView, es troba disponible en Android 3.0 i versions posteriors. A partir d'aquestes versions, l'ús del SearchView com a element de l'action bar és el que es recomana utilitzar, però realment, al ser un widget es pot afegir a qualsevol lloc del layout.
Igual que la resta dels elements en l'action bar, es pot definir el SearchView perquè es mostri tot el temps, quan hi hagi espai o que mostri la SearchView inicialment com una icona i després, usi tota l'action bar com a camp de cerca quan l'usuari fa clic en ella. Disposa d'un EditText per a poder realitzar la cerca.
La funcionalitat de SearchView és la mateixa que el diàleg de cerca. Executa l'Activity de cerca quan l'usuari realitza una cerca i també pot proporcionar suggeriments de cerca.
Vista de SearchView a l'action bar
[modifica]Per a afegir el widget de SearchView a l' action bar, creem un fitxer XML on s'especifiquen les opcions del menú de l'action bar, i el guardem al directori res/menu/opcions_menu.xml del nostre projecte.
- Link al repositori: Pàgina principal d'Android
- Anotacions: Aquest fitxer es troba a res/menu/opcions_menu.xml
- Vegeu també: No
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/search"
//Imatge de la icona que sortirà a l'action bar, en aquest cas una lupa
android:icon="@android:drawable/ic_menu_search"
//Declarem que aquest item és un SearchView
app:actionViewClass="android.widget.SearchView"
app:showAsAction="collapseActionView|ifRoom"
android:title="Cerca" />
</menu>
L'atribut collapseActionView és recomanable perquè permet al SearchView expandir-se i ocupar la action bar i contraure's quan no s'utilitza
L'atribut android:icon defineix la imatge que s'utilitza per la icona, en aquest cas una lupa.
Per mostrar el SearchView a l' action bar hem d'inflar el recurs XML opcions_menu.xml al mètode onCreateOpcionsMenu() de la nostra Activity principal:
- Link al repositori: Pàgina principal d'Android
- Anotacions: Aquest fitxer es troba a /java/MainActivity.java
- Vegeu també: No
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.options_menu, menu);
return true;
}
Exemple
[modifica]Simplement afegint el fitxer explicat anteriorment i el mètode onCreateOpcionsMenu(), podem veure com es pot visualitzar la icona de SearchView i s'esten una vegada es fa clic a sobre:
Configuració del widget de cerca
[modifica]Existint la configuració de cerca, searchable.xml i l'Activity de cerca, al mètode onCreateOpcionsMenu() s'ha d'associar la configuració que permet cerques amb el SearchView mitjançant una crida a setSearchableInfo(SearchableInfo).
- Link al repositori: Pàgina principal d'Android
- Anotacions: Aquest fitxer es troba a java/MainActivity.java
- Vegeu també: No
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.options_menu, menu);
// Associa configuració de cerca amb SearchView
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView();
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
return true;
}
Amb la crida a getSearchableInfo() s'obté un objecte SearchableInfo que es crea a partir del fitxer XML de la configuració de cerca.
Quan la configuració de cerca s'associa correctament amb el SearchView, la SearchView inicia l'activitat de cerca amb l'intent ACTION_SEARCH quan un usuari realitza una cerca.
Nota : necessitem l'activitat de cerca explicada a l'inici de l'article que és la que administrarà la cerca.
Suggeriments de cerca recents
[modifica]Tant el quadre de diàleg de cerca com el widget de cerca poden proporcionar suggeriments de cerca a mesura que l'usuari escriu. El sistema gestiona la llista de suggeriments i maneja l'esdeveniment quan l'usuari selecciona un suggeriment.
Es poden proporcionar suggeriments de cerca basats en consultes de cerca recents. Per exemple, si un usuari cerca prèviament "cotxes", aquesta mateixa cerca apareix com a suggeriment un cop comenci a escriure la mateixa paraula.
Per tant, aquests suggeriments són simplement paraules que l'usuari va usar prèviament com a consultes de cerca en la seva aplicació. Per dur a terme la creació d'aquests suggeriments necessitarem un proveïdor de contingut (ContenrProvider).
Proveïdor de contingut
[modifica]El proveïdor de contingut que es necessita per a oferir suggeriments de consultes recents ha de ser una implementació de SearchRecentSuggestionsProvider. Aquesta classe fa pràcticament tot, s'ha d'escriure el constructor de la classe que executa una línia de codi.
- Link al repositori: Pàgina principal d'Android
- Anotacions: Aquest fitxer es troba a /java/ContentProvider.java
- Vegeu també: No
public class ContentProvider extends SearchRecentSuggestionsProvider {
public final static String AUTHORITY = "com.example.Search";
public final static int MODE = DATABASE_MODE_QUERIES;
public ContentProvider() {
setupSuggestions(AUTHORITY, MODE);
}
}
S'ha de declarar el proveïdor al manifest de l'aplicació.
- Link al repositori: Pàgina principal d'Android
- Anotacions: Aquest fitxer es troba a /AndroidManifest.xml
- Vegeu també: No
<application>
<provider android:name=".ContentProvider"
android:authorities="com.example.ContentProvider" />
...
</application>
S'ha de modificar la configuració de cerca afegint els atributs android:searchSuggestAuthority i android:searchSuggestSelectional a l'element <searchable> a l'arxiu de configuració de cerca.
El valor de android:searchSuggestSelection ha de ser un únic signe d'interrogació, precedit per un espai ( " ?"), que és simplement un marcador de posició per a l'argument de selecció SQLite (que es reemplaça automàticament pel text de consulta ingressat per l'usuari).
Netejar historial de cerca
[modifica]S'ha de poder proporcionar una manera d'eliminar el suggeriments de cerca recents per qüestions de privacitat de l'usuari. Per a fer-ho possible, és tan senzill com utilitzar clearHistory() i esborrarem l'historial de cerques.
Podem executar-ho a un botó o un element de la llista on surten les consultes, "Esborrar historial de cerques". També s'hauria de proporcionar un diàleg de confirmació per a que l'usuari pugui confirmar si realment vol esborrar el seu historial.
- Link al repositori: Pàgina principal d'Android
- Anotacions: Aquest fitxer es troba a /java/search_activity.java
- Vegeu també: No
SearchRecentSuggestions suggestions = new SearchRecentSuggestions(this,
HelloSuggestionProvider.AUTHORITY, HelloSuggestionProvider.MODE);
suggestions.clearHistory();