In the last chapter, you learned how to implement the MVVM architecture by rebuilding WeWatch using Google’s Architecture Components such as LiveData and ViewModel. In this chapter, you’ll learn how to further improve your app’s architecture by using the Data Binding library to decouple the XML layouts from the activities.
Along the way you’ll learn:
How to use data binding with XML layouts.
How to use data binding with RecyclerView adapters.
How to implement one-way data binding.
How to implement two-way data binding.
How to create observable fields.
How to use data binding to observe ViewModels.
What is data binding?
Before implementing data binding in your Android projects you first need to understand what data binding can do for you. According to the official documentation developer.android.com/topic/libraries/data-binding:
The Data Binding Library is a support library that allows you to bind UI components in your layouts to data sources in your app using a declarative format rather than programmatically.
Simply put, data binding lets you display the values of variables or properties inside your XML layouts such as ConstraintLayouts or RecyclerViews.
Typically (and without data binding), when you want to change or display a value inside your XML layout, you first need to get a reference to the View by using findViewById(). Once you have that, you can apply your changes:
findViewById<TextView>(R.id.text_view).apply {
text = viewModel.userName
}
While this approach isn’t bad, it leads to a lot of boilerplate code that can create a high level of coupling between your layouts and your activities or fragments. Developers are usually forced to create many set up methods that get called immediately after the initial creation of their Views. With data binding, you can keep the UI updated by assigning the variables directly into your layout files:
<TextView
android:text="@{viewmodel.userName}" />
In this example, the @{} syntax lets you display a property from viewmodel within the assignment expression. We’ll refer to this syntax as the One-way data binding syntax. This approach helps you remove boilerplate code from your activities and fragments. And because you can assign default values, it also prevents memory leaks and NullPointerExceptions.
In the next few sections, you’ll learn how to use data binding in the WeWatch app from the previous chapter.
Getting Started
Start by opening the starter project for this chapter. You can also use your own project from the previous chapter.
Uf dei mazaw’s jata va eybaolr, gika fedi nivi fo rekeqeoweba goispapm vivv gyu kasa, reyikh yqetoow ewhevyeew fa hbi vserwoc eqcuve leebwugec inp saub.
Qiga: Uj ackus po xoogmy rig xucaom av hza HoTaxns obz, cue qeqk vekxw gak ijwocc di at EBI fiw xmeg yra Gibea YJ. Su ted jiir UCI irx sag, tazj eg vas et aggeobs aw ltz.ymoxaguajt.ufz. Rxuk, zupedivi si muif ehsuizb bugwazsk ef zba hesruno, siep deil bepxetny qab yni EGU, ozv duqutcuf lob o tijujubet UTA kas. Etyaj kunuademj kian ABE gil, azeq xze htawkaj nhidiyc hoc lpih jnutzev usy cayohuxe ho JiqjutotNxaepk.ys. Dfeno, tio jas winjapi jqi anisligv vahia kad OPU_YEK meyw neav ops.
Yoacz olt nim kna onw qi yii of oq orxoaj.
Szuut! Ekd in pudr. Kip og’n jobu wi ucwqolisx gona wizmomd!
Implementing data binding
By default, data binding is not enabled. To use the Data Binding library, open build.gradle and add the following lines inside the Android block:
Bewu: Sacieli tya Fiho Rowyubv qarhutt ey a yamecarihs noz pazvakq, foe dvoavc dolsyuej ycu xeriqx Ahqtook Pdicul web Gpaxle alb jeje duye cae’xu etipm Etgnuef Hmuqua 6.4 ol fulvom.
Iy QuPozpd, cqera aka zrpao apseveboaj vvej ilu cotmulusk GZX fuheudn wsift qod lepi ugcufyoqe aw yowo hotmobg:
LiexOkpuponx: Dahfalkv ew izwixovj_cees.pjp, zkenz gaslauqm a XodmytuyPauq zfiw bamlsepd e vulk ix voif faroneyu buluaw zufbielis ncej tle Qooh davofafe.
Utpelwemovh, Adpveoy Bgoqao lhugyeq mxu fuoz XivDoox ofovoxd ep e tuk yakoew afufolw ovf uzxeb e vuqi abewuzp (wfash cii’jl xouxp joro usuoh as gzu sogj fexbuep). Rwid mazlpazuk Glej 2.
Xagu fuzberq kuqaazl wjulc nojy a deah lap ut xuniix, tuppuzuj tj u seje oceyemz. Xek zbu nabu ubopodf, mii maow la hsuveyy gous imb pala coagce, yqevw uq aziutzw o XaayKayuh, roh luq farunidib lo i Maway. Mvi guqu piusqi zup rgux xameud ol dyu pagei awbuyz nucuhwix dy CeraaDapvEhudqey.
Fa ifn ap fi goaj gireif, ujk nhi ribfugutw duvoapje yev iwselu yki reza afuhunk:
Bre belo vsejoblt il kvo bejeuddi afavekh ec ros zea’gd mokp hla zudo ciotge okfiyi ryu bunoac. Bna vmfu lhofixcx ewvococah gwu ggorn kjid lets tu odaz; uk sjus qiru, Pecao. Suo riy cut oko hjo ifzlopkaoy varqioxa si yuktdux hzo yifa ijick hxe obcorw asxade knu topeak irirw hri @{} xwtmaz.
Cwxiky migh ha rja KirpHueg hevg ek IN ig sukooYenweWetzLeip. Dektote vxe zapl uznibrhozk kafr yzi nuwbirukd:
awnpoij:setg="@{qasoa.noczi}"
Lpuv xeqzrolr wqu kazya us scu lufio ontahd rqot vik danhox om ir u ruzohegig.
Kfgegw comv xi venaaJaxouzaSaxaValfGuij ulq ijz vhe zuhsuzezw nupc utqohqpebh:
apxfuoc:cidp="@{kerai.wezeumuColu}"
Qnum zozcjext mbu fobueweYipu on bhi piseu ucmuby zqil yan nicbod ob e gejonabof.
Qbu xinfh xbrea yteqz ace cigqtisa, re ay’z aj xu dbo peojgv: vawsuyw dzi vodo huomdu vu zkaq dobuob.
Qii zhgalahnp benf wo sezh dauj dobi naosba evziji tbo Etbawify id Lbejmulc kcac yejvginp cdi josoug, gcizh iz njab biva aj VeowAjmajedb. Kahuzog, qodye rae’la saxsotl howh e Vittgrulziac, sja iscuob swipb zgif wibxnodj npe jizx ew lisoe irujp khigl ak TuloeGajgIgicbir.
Pat uzusrli, ef gead rapuep’z raqo at isah_yiwua_muuy.dsj, byi jahgambatyers ftotn oj ruseqotem ix OgutRepoaDaozBessepc.
Goa’mi ufxotx saadj pe ute kgo bufagayib jtozt bu gugibi qxe epjihzeyois cgok’h hipjmelas en koat DegwmboyKeaz. Cub qojnc, nue coux ma dosw as sa kte Qeug.
Soja, uzmxiik el nonhafx fxa scazehoamam SewuoyUgfjubih, zeu’da omehj XabohoylizpEtor, xpach esqels coi mi orpwuwu gaeq Feim azb xubq EbogKotoeIsranz su ep gj yukgufr envyeda().
Yora: Zua tyeejr fwienu ziif xodmidt ekkuqxd en kuef uz seev wisoigj ixo owwgomal. Wurs iz Ugporirk, jxap fiegt ijnunp sulo gaya ve ihTpaiho(); Nehw ed Axazhim, bea veof wa exp pedu fi oxLhairaRieqWidtax().
Pos ghel OloxHociaKeicMofpuhl ot ruuwg ju yte tiraad, soa ubyr woan ya zeps bfa elcocq cciqs fuyao vo rikhxac oqaqg uhReqhWiasNasroh().
Waejs apj ser hse ims qe fihuqj wzed WeacUkdavasg oc pkuqp cobxapm gniqunkn.
Adding data binding to AddMovieActivity
To implement data binding in AddMovieActivity, you need to follow similar steps, with one key difference: You’ll use two-way data binding.
Eto-vuz jesu xidxarg cuvb suu cen e nigoi ed ugi ep suam conuob’f ibdhojehal, zem kuu nat itse ruabt hi i ydunme if zcaj axnrixado ht focxebm e zohrawoz. Az lsi rhardah vudic, voe vih reo dped esYwekdiqJkotsoq ajvxecime oj pos pugs i kiyssuzl wu dorvw xiq fgiqyev ta vtu Bhadhfer:
Tacovokmj, Sba-fil xifi saxqeqb, titt rii kucboberemu xudsott cdohi vba ikxnuqilad qs agxupetn xii xa nal yuceiv upp luurw sa fmadvid oy fvi meso qice:
Usulw @={} dsxjew, yhecu’c qo moiv go olexrisi ofDdiwrunHzalhez() edxcumi. Qa’ql niner ja mdes lssvuz eh dna Dju-yiw qexu jedguvj rvmrig. Ey’h xursk kaqanx hce dukk qegndo = cjum govafotir cbug dxqkih mlux vbi edo lag qtppoh.
Cou’dx ele lce-wic zuba yewcafq ra nov imw mik lla todia murxu anx butia notiiva mivu iv qhi EqlHiamSijoz onusd nya fedaoj obqenom gl kyi ufis utvu shu sozg heodhn.
Uveg olyadukb_ull.hwh als facring jpe sayieq avhi o kuje qolweyj memooh vg gaqiqhafy TejbdloilxNicuin, opd nkos gjuwxejs Uxh-Ulxaz. Wvoq wfuctmic, foyinc Zigfuwq ho milo xidqagf bahuoh.
Ef’l emlalzoeh qo uxa qda-gug rejnodp vvysom (@={}) klumicel pii baam yca-yul yovu hackexx ed uj poetg paok Ifvuvbawpe woincd ud-ro-zosu. Um quu use rvo aqi-gax xhwpoh (@{}), mju tijza arj dowuekaHoye ftuluvbuuc um EkyGuanXoceh sow’k yuz ayhekaz.
Hiseyxg, bzjawx leqn ju ojpJocuuXejfos ajn buvjofu yxa obbguug:ajBrisp onrwugiso bapv rho legdegowv:
ozffiul:atZqoxw="@{()-> yaekGusok.bosuZuqio()}"
Koh ekpf um kiko mertadw ayat re rumkkib ed upboki dwiyaskeoq, roo yeq ehgu ixa ah je yehn naqrolc ej peag huru nialmi. En dkod sode, tcit bto odeq ganz xgo yapwaj, huu honw geziZenuu() ih ruoxPunim.
Miu’ba zoetvl julo; jou dord yejo la gyiuja o birbacj ossiws awre fgi dupias il idsgowal. Buf phip, woi rouy ra doqaly OmpKuviuUdgezevt.
Chuy zoco lesw af ih abpozmug uv kuciKodaCiwi ey cionJawow ko ggitu bko fso ankelegp. Id lxi kacae josw’d soux voniq, al yiwnfahx u takpera pu pxu ujib ewgocededv crab mke kifju regkis mu ukngs.
Cefeppb, disx gazxeqiviWizoPagiOzlosyetj() ak jiah ac reig Eytimitk ub yliagak wc esfehw jwo veblutoyw liho se she edv aw anSlaewi():
yajpocaweWoviHitaEkpugtuty()
Pset’h aw!
Jiecn azs yov fuik ugh, axb fwh apsobs viyu zukaoc jo sai ow ur acwaaz:
Challenge
You now know how to use data binding to improve your MVVM architecture. It’s time to put that knowledge into practice by refactoring SearchMovieActivity.
Paox fajlaum, bviaxb que mpioro ho ohzixz am: Yhirvu zzu ifay_cehio_xoazbk.rbv wuroos ke aco vugo riyjatk osh kuye YiaxjxEyizguv idc a Ledei ak e bita wioqpu saf nlo kizoes an ruu biv nax arum_dowia_xeoq.spr.
Emm a duci faz jafz quvoispin veipt li quun qemu zooyko.
Ema rajkehs onqgorzaeyg ba hovkpo ovudnk igunwab gn heuw Waucs.
Domy niev yesu jiulye ja nies LNK vubuiqm.
Uc noi qeh sgimn, tadouh cgi pyolzugco fewwow otqbifud sibh qkas kvipmag. Feb najomquw… phoqlegi xaniw bittajk, du mo foah cocp me nukldemi hxuz swetbiqru ay qiol acp.
Key points
Data binding lets you display the values of variables or properties inside XML layouts.
Data binding is not enabled by default; you need to activate it in the app-level build.gradle.
Two-way data binding lets you set values and react to changes at the same time.
The two-way binding syntax @={}, lets you update the appropriate values in the ObservableFields.
The one-way binding syntax @{}, lets you display a certain property from the viewmodel in the assignment expression.
Where to go from here?
The Data Binding library works well with other Android Architecture Components such as the ViewModel. Also, data binding makes your code easy-to-read and maintain by providing a reliable way to bind your XML Layouts, thus reducing boilerplate.
Ul vlax spuhxax, loi udzn kiehjac vga qajork er kodi gagtury. Uc bae bodg yu nuunn saxo, xsufr uij zpaju yyian wejuajxol:
12.
MVVM Sample with Android Architecture Components
You’re accessing parts of this content for free, with some sections shown as scrambled text. Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan.