Android/Binding Data

Salta a la navegació Salta a la cerca

Vinculació de dades[modifica]

El Binding data o la vinculació de dades és el nom que rep la tècnica o metodologia de vincular un element visualitzable d'una aplicació (un text, un botó...) amb un element del model de dades (una variable per exemple). De tal forma que els canvis realitzats sobre un, condicionen l'altre. Per exemple: la vinculació d'un text d'un EditText del layout amb un variable de tipus String. Tots els canvis realitzats sobre aquesta variable es mostrarien per pantalla i a la inversa, tota seqüència de caràcters introduïda per l'usuari a través d'aquest element de l'interfície de l'usuari es trobaria emmagatzemada en la variable enllaçada.

D'aquí surt el terme de vinculació entre elements de l'interfície de l'usuari i del model de dades. Podem concloure que els elements de la interfície d'usuari són observables i observadors al mateix temps, ja que també es veuen condicionats pels canvis realitzats pel model de dades.En general podem distingir dos tipus de vinculació de dades:

Esquema de la interacció invisible a l'usuari que succeix al aplicar vinculació de dades en una aplicació.
  • Vinculació de dades conegudes: aquest és el tipus més utilitzat, on es realitza una vinculació de dades conegudes. Per exemple, el TextView mostrat a un usuari amb una variable String del model de dades. Per fer aquesta vinculació els objectes en qüestió han de ser compatibles.
  • Vinculació de dades avançada: en aquest cas la vinculació de dades es realitza per objectes "desconeguts". Per tant la vinculació es realitza en temps d'execució desde l'Activitat principal. És a dir, aquest tipus de vinculació es realitza quan en temps d'execució s'escolleix quin objecte és compatible a vincular amb un element del layout. És molt comú quan l'element en qüestió forma part d'una estructura de dades més gran (una llista, un diccionari...). Per exemple, una aplicació on es donen diferents resultats numèrics per a la solució d'una equació complexa. Obtindrem múltiples resultats però solament es visualitzaran aquells que siguin positius, per tant solament els resultats que acompleixen la condició indicada seran vinculats amb elements del layout en qüestió.

Per fer ús d'aquesta tècnica haurem d'instal·lar el complement d'Android per al Gradle 1.5.0-alpha1 o una versió posterior. Com que per defecte Android no està pensat per treballar d'aquesta manera per utilitzar aquesta tècnica haurem de descarregar la biblioteca des del repositori d'android SDK Manager, anomenat dataBinding (per defecte ja està disponible). Posteriorment, això hem de modificar l'script de Graddle build.Graddle (Module:app) amb el següent codi:




Sync.png

Al realitzar canvis en el Graddle haurem de sincronitzar-lo amb el projecte, per fer això farem clic en el botó Sync d'Android Studio que podem trobar a la cantonada superior dreta.

Vinculació de dades:pas a pas[modifica]

Per realitzar una vinculació de dades em de tenir en compte quins elements del nostre model de dades seran vinculats amb elements del disseny. Per tal de fer possible una visualització en pantalla d'unes dades és necessari que existeixi una compatibilitat entre el contingut de l'element del disseny i la font de dades. Sempre és recomanable realitzar un pas previ de reflexió, per tal de saber quina informació del nostre model de dades volem que estigui vinculada amb el layout. Degut a que aquesta pot ser modificada tant per la pròpia lògica de l'aplicació com per l'usuari . A continuació es pot veure una classe usuari que posteriorment utilitzarem:




Continuarem editant el fitxer del layout de la nostra aplicació, utilitzant el layout estàndard. Amb l'etiqueta anomenat data indicarem el conjunt d'elements del model de dades a vincular. Cal concretar el nom de la variable (de l'activitat principal) i el tipus. El tipus o type a indicar és el camí per arribar a la classe que pertany la variable en qüestió. Dins de l'element data també podem utilitzar diferents imports, per referenciar classes implementades per nosaltres o del propi java dins del disseny al igual que es realitza normalment en codi java. Per cada etiqueta data solament podem utilitzar un tipus d'element visualitzable, aleshores si tenim diferents elements en el layout declararem tantes etiquetes data com elements que necessitem enllaçar. Aquesta vinculació es realitza indicant dins l'expressió de vinculació, els atributs de la variable utilitzada. Aquesta vinculació es realitza independentment de com em declarat els atributs de la classe, siguin públics o privats. A continuació podem veure un exemple de codi XML, on el textos que es mostren per pantalla pertanyen a atributs d'una classe 'User':




Vinculació generada[modifica]

El codi indicat en XML ens genera automàticament una nova classe el nom de la qual depèn del nom de l'arxiu de disseny, afegint el sufix "binding". Si el nostre arxiu s'anomena main_activity.xml la nova classe generada serà ActivityMainBinding per exemple. Aquesta classe té totes les vinculacions de les propietats definides en el layout(el que indiquem amb l'etiqueta data) i determina com assignar valors per portar a terme una correcta vinculació. Com es pot suposar aquesta vinculació es realitza per cada activitat i layout, incrementant així la mida de l'aplicació. La vinculació pròpiament dita es realitza des del MainActivity principal. En l'exemple anterior realitzarem la vinculació del nom de l'usuari per al text que apareix per pantalla. Per poder fer-la hem d'utilitzar un dels mètodes declarats en MainActivityBinding, encara que podem afegir-ne més depenent les nostres necessitats.




Com es pot veure en l'exemple, la crida al mètode de la classe "vinculadora" es pot realitzar abans de la visualització dels elements que es troben enllaçats. Al realitzar una vinculació de dades hem de tenir molt en compte que la visualització i la lògica estan lligades entre si, és a dir, els canvis que succeeixen a nivell d'execució i que són invisibles a l'usuari afecten a les dues i per tant em de saber en tot moment que ens interessa enllaçar. Tanmateix, també podem dur a terme una vinculació personalitzada de dades, és a dir, podem escollir la variable, el layout i l'objecte del disseny pel qual es realitza una única vinculació. Normalment aquest fet ocórre al intentar enllaçar o vincular variables d'altres activitats dins del mateix projecte.

Expressions i sintaxi[modifica]

Podem utilitzar una gran varietat d'expressions al realitzar una vinculació de dades, encara que l'expressió de vinculació de dades s'indica amb @{ }, amb el contingut a enllaçar dins. S'ens permet utilitzar un llenguatge d'expressió molt similar al de java, on trobem:

  • Operadors matemàtics: +, -,/,% i *.
  • Operadors lògics: || i &&.
  • Literals: strings, enters, caràcters...
  • Altres: crides a funcions, ús de mètodes de classe, recursos, comparadors...

En el següent codi es pot veure un exemple de l'ús d'aquest llenguatge, al realizar vinculació de dades:




Gestió d'events i Listeners[modifica]

Una de les característiques de la vinculació de dades és l'escriptura d'expressions que ens permeten gestionar la resposta dels events succeïts per l'interacció de l'usuari. En general podem diferenciar dos mètodes per a gestionar un event:

  • Referències de mètodes: com es comentava en l'apartat 2.2 Expressions i sintaxi podem fer referència a mètodes de receptors dins de l'expressió usada. Es basa en definir el conjunt de respostes dels events que volem captar fent referència a la classe i al mètode corresponents.
  • Vinculacions de receptors: són expressions similars al cas anterior però que s'avaluen en el moment que ocorre l'event, el receptor s'enregistra en temps d'execució.

Les dues alternatives són similars i comparteixen l'ús de crides als mètodes que gestionen la resposta a l'event ocorregut. Com a principal aventatge respecte la gestió d'events que es realitza típicament podem apreciar com podem delegar la gestió dels events a components del nostre projecte que no siguin la pròpia activitat principal, reduint així la quantitat de codi d'aquesta. Per exemple, donat una activitat , el layout que es visualitza corresponent a l'activitat i una classe addicional, podem delegar tota la gestió de les respostes a events per part de l'usuari a aquesta classe sense que l'activitat principal participi.

Vinculació de receptors[modifica]

Per poder utilitzar listeners en vinculació de dades haurem d'indicar en el layout el listener una directiva d'escolta, com per exemple un android:onClick. Com es realitza típicament en android, junt la directiva indicarem la referència al mètode encarregat de respondre a l'event succeït. En aquest cas però ho indicarem amb l'expressió de vinculació. Aquesta referència del mètode ha d'estar declarada en alguna classe del nostre projecte. La principal ventatja d'aquest mètode és que podem observar els errors ocorreguts en temps de compil·lació, quan es detecta algun error en la resposta del event o de la vinculació realitzada. En el següent fragment codi podem veure un exemple de la vinculació de receptors realitzada pel click d'un botó amb una classe usuari:







En aquest exemple la resposta a l'event succeït "onClick" és respost pel component usuari. Depenent quina acció volem realitzar quan succeeix un determinat event podem gestionar la resposta d'una manera o una altre. En aquest cas com es modificava un atribut de la variable user el mètode encarregat de respondre a l'event s'ha declarat en la pròpia classe, doncs posteriorment es mostrat per pantalla. Per tal d'implementar una aplicació més sostenible i modular seria recomanable utilitzar components o classes responsables de la gestió d'events.

Referències de mètodes[modifica]

Les expressions en aquest cas s'executen quan succeix l'event en qüestió de forma similar al mètode anterior. En aquest cas el receptor és enregistrat en el moment que ocórre l'event per la pròpia vinculació de dades. Com en el cas anterior s'utilitza les directives dels elements del disseny per tal d'indicar una expressió de vinculació. En aquesta vinculació indiquem el nom de la classe que s'encarrega de respondre a l'event succeït junt el nom del mètode en si utilitzant els '::' per realitzar aquesta referència.




Com realitzaríem típicament en android dins la funció onClickMeu realitzarem les accions a convenir segons les nostres necessitats. Com es comenta en el mètode anterior podem utilitzar una classe encarregada de respondre als events, en aquest cas l'em anomenat gestor.




Referències[modifica]