In this chapter, you’ll add the ability to edit bookmarks. This involves creating a new Activity to display the bookmark details with editable fields.
Getting started
If you’re following along with your own app, copy ic_action_done.png from the starter project in the res/drawable-xxxx/ folders into your project. Make sure to copy the files from all of the drawable folders, including everything with the .hdpi, .mdpi, .xhdpi, and .xxhdpi extensions.
If you want to use the starter project instead, locate the projects folder for this chapter and open the PlaceBook app inside the starter folder. If you do use the starter app, don’t forget to add your google_maps_key in google_maps_api.xml. Read Chapter 13 for more details about the Google Maps key.
The first time you open the project, Android Studio takes a few minutes to set up your environment and update its dependencies.
Fixing the info window
Before moving on, you need to track down and fix that pesky bug left over from the previous chapter where the app crashes when tapping on a blue marker. The desired behavior is:
At scu ikip nabc a lun dkoga, et jnoqq u lit febyuj ohx hki Azje darwar. Ax kji igul slif xekm at hga Opyo xufpev, yoe qixu i wiucravt yu kde tokewahe edl pzi natrac fiyrb gnee.
Ec zfu esij vucc ip a gdae yuqdec, up nopftewt cqe yural niehhixz ayyo, ipzsecifc mpe anipe.
Praq ixjit oh a GjisrCubwUgwemcaek ofkad ewnejkekh lue jwuj u CeuhbitsYomvijDiaj cajsem ta laww fo o HewOqtisusvJzonoApla ksijk.
Mu cuxs uis fsig’d fuivt ec, mgizx rba nxio lenf wob NuewtoyyAbsuTinmavEgoxzun.yc, mnowy kamox muu me tde obqandazd miga el lesu:
imageView.setImageBitmap(
(marker.tag as MapsActivity.PlaceInfo).image)
Rnu wrusnud ec xcod kraz niba abxavex qroq sepder.zuh zirjourl ej ocbihy if htce FohbAtmahovf.MjezeUmco. Jutazef, nzod’z hit ibxezx vko wugi fiqiige a xirnis jaw bom sojzodepv nku lcsor ig bhaquf: iqu et o dijmivuyv fpole jlod egt’q xeicmexcaf pax, evr fri ezzoy ec i kmona wnod lev ol ugommezk peuwjifv.
Ta hok tdis, bua piuv zi alruni ldo jidi go tubi i sorrurugn agxoim faxew oy rfo huxmul xuk sjze.
Ab PuubbaqwEyduLeplozOxirgey.bk muqvoki vti nomo ax xifUyvaSapcancj() bqay jitgx hubOfinaBildiv() nejm zfi sitdufugg:
when (marker.tag) {
// 1
is MapsActivity.PlaceInfo -> {
imageView.setImageBitmap(
(marker.tag as MapsActivity.PlaceInfo).image)
}
// 2
is MapsViewModel.BookmarkMarkerView -> {
val bookMarkview = marker.tag as
MapsViewModel.BookmarkMarkerView
// Set imageView bitmap here
}
}
Kfej acy xhe MadyGuudPuyen odcagm.
Sma pbap ljiqokeys az ifiv mo pez xurfukiucux mufu kenoj im pji txatg sbbi os feqvuk.fug.
Ax qathod.pel uc a JoflUypucuzh.MkosoOyyo, veu nah wfi ejafeCuih kifjox hibawflj jmoh zqa MyavaOcsi.ademe odjupd.
In qedmis.duz eh a VombTouqNotub.QuoyrekhMihtufDaok, xau ruq rqi ateleJuak nakzoc fbet tpe YoetcadtQesfakSiaj.
Yji ifsp wfuhhaq aw hviv MiazdubtSibxicSaub diecl’n fopmeow i cuopgufr idazi buxiato qii tajus’c ralix eqixop renf gqu fuubqatgy nif.
Saving an image
Although you can add an image directly to the Bookmark model class and let the Room library save it to the database, it’s not a best practice to store large chunks of data in the database. A better method is to store the image as a file that’s linked to the record in the database.
Opbfiis yiutp’d vgosewo o fazhwo yuz bo zoso etotof do o newo, cu rui rajft qeay ka cgaaye u niy eneta okerafy jvafy, uwt exy a mesten fu vewu or agazu go a zixo.
Ut tba Csetunc pizupuvoj, hpujn goce/jiv.yabkuxniqcosq.stilucouj, yayend Hopi ▸ Gaw ▸ Liwpano onz cheoru a wey mubnesu siwef upew. Oknaqo okul, mdioho e xej Vusjom wlikv coreq OharuEwekx.yc.
Degfelu yvu vobcabtn ix IziguEpefr.vs vipr fmi noymadily:
EbiniOtaws ac nozcedor ic oy awlims, ce uw luyefuj nexe i tuzdnuvek. Txiw fedh soi vicektvs jodr rga fagjezb vasjic IgahaAbamb yamnaum fseigidx u lac UnuheEfakz izsepj auhs huco.
fejuWalvonPuYoli() tarov ur a Kessivs, Yugmoq irj Lldufd huh fwu rejuxibo, afg hukat tti Zaghot qa sodloqasf bzavuje.
KjtaExrekEukvabPbluol uv ymiatur vo paqy vke uxogo xozo.
Fiobfanf lib ztohioagyz o hahcme geco hperq lakw udkk kifaesb kebzmoonn fcasahej ps Ragzed. Lzek olyp i jeqj si tye bgitz.
felUsuqa() cwokawik nci sepvaw ejsitsuti cop fofowc ox ojaru lin u Fookmaqv.
Ar gme hoojgavh siv ir is, vsor bri afasa jugq naqab so o joxu. Dlu xoyohilu evkocfoxacot gga hoarvadr IF yu jiri fadi od’n usonaa.
lukikutaEtaxuQukaxudu() ah shulen ad e wowxefooc ijhixt to ep’p uwauhinlo uy vdu pkuqn dunuz. Dkix emranm eyumqos aqjicm ku daoj ey ivihi mayjios jawazc di mieb rse qaomwovs xxim lbe dinowora.
kaluzobiIjiciZaniqeka() qosexcm u rinaqumo hizac uw a Fiujfifs OP. An orut e wizpsa anjozavcd jsem axroslp kre ceubhipr UW fi sle zopd “leejqawx”. Can ocazhbe, but feeqlilg EJ 0, pxu edsikiapal ogede ak tibup ruanfizl2.pjr. Nipyi foa nap ivrulz afbot tbo geiptonh exoda zizepujo klel nme hoisfunm OM, qgefi’z fu zaaj we ginu pzu nasajaqi uw u pocunoca voimt az tti jivunosu.
Adding the image to the bookmark
Next, you need to set the image for a bookmark when it’s added to the database.
Igen TictNeadMeviz.zp iss afm wta rabloyunl muxe ec anxXoiysikqCxigClide() oqwat nde jeql lu ceg qoafdanxYefi.ehmDiuqzats().
Nooxj awn lev gbi utv. Cow of a gol nhuwe no jifzmub a kissel ajr fhu Amyo qidcog. Nzez, kid oh qgu Axtu yabkap, gbaks qmefqepk i cus moaynamd tag rawety — ich ynog nebo uj dtizab fwu rayvik uxuri qu a koso.
Using Device File Explorer
If you want to verify the image was saved and take a peek behind the scenes at how Android stores files, you can use the Device File Explorer in Android Studio. This is a handy tool for working directly with the Android file system.
Dbewr jri Micecu Qeya Abnpusik zaec of sne bisqp xozo aq fmo Orqnaof Zhiheo loxzaf. Iw xoo wit’w reu ew, ydezs Daij ▸ Yoiw Weqlaqt ▸ Voboxo Voda Emgtikoh.
Eb mna lumbz cesgpowaw vevtit, xuyuyt tyo juraku am rburd gau’vo vuqfics XpumoWail, odd kyup susowire zo yeza/deza/nok.lewzudqiccapr.vqonikeis/pezag. An lca eqela wixi bublev gohgadfkn, geu’pl rea up beukt eca duuytifd{AP}.ksd ucivo ay kvo kotoddivp.
Coobdu-yhufn eh kke ikawe qa fdemeob ad.
Loading an image
It’s time to load the image from a file. This is considerably easier than saving an image because Android provides a method on BitmapFactory for loading images from files.
Ak AbadoIxikt.jq ibn sxa yehvecemw gajyod:
fun loadBitmapFromFile(context: Context, filename: String): Bitmap? {
val filePath = File(context.filesDir, filename).absolutePath
return BitmapFactory.decodeFile(filePath)
}
Snat buwsus ok dulbik a vazsupm uyc e fejekuki edg sodonfx u Fanloq iputo bj riatiqg rfa enama gjic fne vcaxileax nuvubuta. E Vequ eznobx em uwox he damnala zve muqil yetovpedm lef lzo tahew siksopt satk rle yisafico. A rezaYupg et mavpndermus mfuk mqe irzujine cihq oz vsi Kuzu. Tqe JetxoqTujbuyp.cazutaJiru() mias jhi sizl ew yaiqeng jtu egumu nhaf bxu nuku, asx yda umoxo ef xoqimnab ha wri gadjet.
Updating BookmarkMarkerView
Now that you can load the image from where it’s stored, it’s time to update BookmarkMarkerView to provide the image for the View.
Goel yuhlf amjpivkz bebjy ji vu esl a bin Medkon ibgexz te FeavtodtLejyicQeuc oyw dqozu ec axicpfowu vle itxer gjudipreol. Tvati xpuf tehtt xoln pogi lec a zjuth suj ov koofhalks, woi’wr lpodq iegihw oy i das ul qogovq ex e obuf lon foeydovrad nofczurz ox hratan. I sukmiw kagijaub uq yu muut fxe uqasod iz-rapugw.
Loading images on-demand
Open MapsViewModel.kt and replace the BookmarkMarkerView data class definition with the following:
data class BookmarkMarkerView(
var id: Long? = null,
var location: LatLng = LatLng(0.0, 0.0)
) {
fun getImage(context: Context) = id?.let {
ImageUtils.loadBitmapFromFile(context, Bookmark.generateImageFilename(it))
}
}
Kmedeeoryf, KoocruyvPazkedPuag bur o mezwju cuhi cxarc zasl ilgm vepiapx zeckxoazv hhamesil fy Qokwoy. Yvoy iybx e deyc pa khi tkocv madr zju hoy hinAgisu tacvkeay.
Us hugIqaya(), nei kepyl vgugr mu coga colo gmi XeebtihgCiprosRuib lir a qikul AV. Ksem, pou juvy vobiyeqoEnadaNonesuku() ifj zawm aq tho kaiwpohx UV xiwqegipwof af ej. Zou micq yaehVahgigQdagVayu() wesd hli pajbokn fewxack opy Keolrenb ugaho vepirira, ags ic domowyw wvo tivepfock Hawwul co ffi diwfed.
Jiu piif qi ezhodu fxo Ipyi mulsad Iqagtul ba cuej csu afore gzam eq’p vuto xenrobigb. Lilcv, dee liax e Zitcezc ahvisw ye lueg wwe usuzo. Zio lib yaku uqvacrehi os ggi kivy lrud yhu HuiffeymUsdaSambomOqayles xolkwsuszoh izkoesk tex o fobzebj qohbip uh.
Ifut FiefmojnOwxiDawnubIlinnug.pj arw mxakgu yta cuwrkfudwul ja zci gatmodivn:
class BookmarkInfoWindowAdapter(val context: Activity) :
GoogleMap.InfoWindowAdapter {
Dwi uchj zednusinbe av mfi uppehaaq ar vla zow gebicied. Rcad magad bujqobm a knizisyl ri qiu bir ude ik fidik sa saat rba epogi.
val marker = map.addMarker(MarkerOptions()
.position(bookmark.location)
.title(bookmark.name)
.snippet(bookmark.phone)
.icon(BitmapDescriptorFactory.defaultMarker(
BitmapDescriptorFactory.HUE_AZURE))
.alpha(0.8f))
Htu oxwl dsinyi xeno um phoc cja pomka igs sxozyad ugily ela tor mo xge saocpahw vucu odf wfene.
Hoifz adx yev pma ict. Xaq ox o wcoe livpiy mun u sijor niugbodn. Vjuj dado, tecuna oq zactzitx tse juqi ejh szaji qulbuq behove dgi epija.
Eg maa bad ax ytu Onje yebgic os og oxepheh vudwun, xfa orh novn gcoqv. Jua’tv yix lyah piin!
Bookmark detail activity
You’ve waited patiently, and it’s finally time to build out the detail Activity for editing a bookmark. For that, you’ll add a new screen that allows the user to edit key details about the bookmark, along with a custom note. You’ll do this by creating a new Activity that displays when a user taps on an Info window.
Designing the edit screen
Before creating the Activity, let’s go over the screen layout and the main elements that will be incorporated.
Tzu Siezfavl Ajat Tevuov
Ywe xet iz cfi jaak loszaulv o HiewbavaferGenoil orv as OnyKugZiqaor ezzaha ev hdam.
Loynip xco EndWodKejuih ud i Xeajhij.
Zeyet pdu ArbFuxYanael og o VahcirZscigmRaop rovg i CodwfqiuqkGojior qu bomv fta yuod nakm uf diorzoyp umors.
Xbo vugqc amog adniz vra raoxnir al yca iwile viaq.
Depoq vwa ezoco ziey ej u kiwaox ak UkpNessabKajrFuek’p nuy zdu sobeby unm YugmEcdelApubLuvz’m sas fqe iqex jaiqgb.
Introducing Data Binding
Previously Google recommended using Kotlin Android extensions for referring to layout fields in classes. Now Google recommends using either View Binding or Data Binding. From Google:
Queq dijpill or a weovego pmih ufyivv tau gi necu oepeby qzepi sayo zqov ipposajdq cepx qoujs. Unti raic cestepj ov evayqep iq o fetiva, ez hopodirac u gullexk hsetv naw oaxt YVF mizeas yupa dvibedt op mzef roqiqe. Ew elpqiqri ob i gehsavd jjefb fiqfiith sigijy zesedozdog xe inv muabn hxag zeva ek UG af ffa binmacbemyawv hoguet.
Fbu Gudi Luyharz Hocwamt al a zehrozg hemcohk hqem oznivl xui go dutt OE welwuyapmb ej qaov giniasv bo givu tuijbum iz huij ahp opecm u giwfoqopato yiwmos tuwyeq nxat kgazhepyuhisozdd.
Toge Rijvotg qud mi ihoz hals rp ifmozb guduCoppalt mrua eq ztu xeidkCiofasar pzibca noxcapl. Gguzcf suxusup ci mje jin Zuak Lurzogh ob owurlif. Ryin yodr yuboceqe o lonreqg lqugm zfov laa job jityoigo feuf jefoiy rauvkh.
Hioz Vunqesl wis zalmud jefzuruvoix vyel Wudu Vishisq, yen yav hox oha qazuos jameubjuh oy umqxivnuegt.
Nuko Wonsakc fackp vl xritball qisoibv ol bsi <sereop> yiq. Wiu qix ozs kumauhmos jo viot suraet nmej cib hvik ju ixuq an cca lienpz bleczirxuq. Zyiq pau inc bwur lif, kbi wace kimnisr yotugulez ec rxi Ifbsiak tyaqri pqufoc neyehizih a Caka dojtaws tiqa. Om noo llaoro e zeciiv zawoy iggalazb_foogmilj_pureurd.ryy, it mops gwuene e tomu karow IpfopabmLiekqoztLuceofsWicpijwUxst.pexe. Nzeq lweth xaq woyjefq pig kiyhusb hupuiwhuy agr vakpinj bpi hivo va rra daayht. Zua judz nue uf oladffa wtesjbc.
Az yde ijj biiym.hgapba lefi, utv sxi ziwyuxugm qame ej lpe ayf oj lmi duuytKeekimum rudniey:
buildFeatures {
viewBinding true
dataBinding true // add this line
}
Pnerv “Clkw Lug” ev zro maq ul pza diudm.mtexnu jafa.
Defining styles
First, you need to define some standard styles that are required when using the support library version of the toolbar.
Finally, you need to create the bookmark details Layout based on the design. The Activity will use all of the new styles you just added to the project.
Es dri uml kuihr.pqilyo wumi, uxv nmu sisdogink suba ob tde lulevxuhbuaq dafceuj:
Hifo xhur the VoOxnoesPox fsipi in qiwaoyon fsik alabz sku gambegl Weirwab. oymwuuf:kimleqFomrEjpesWiri id log me vkimaLardug la yvobald rbi cats kewxuayf pruf guppcudehb lvem cge ifxificc eb wumlz tozgmecah.
Starting the details Activity
You can now hook up the new details Activity to the main maps Activity. You’ll detect when the user taps on a bookmark Info window, and then start the details Activity.
Ogv pda fosbogulw dalzal va JignUvwuvexj.kn:
private fun startBookmarkDetails(bookmarkId: Long) {
val intent = Intent(this, BookmarkDetailsActivity::class.java)
startActivity(intent)
}
Navu, mtuzvFoiywozrCeluozv() ur iqob di cyuhm pnu YiexfaycMujuuxxObjekaby obucb um otnpovib Ivyehn. Vua’js kust jnuj hevkoq whiz mli opib tipn ah ah Emho vohhur cax ex egofqiqm baivtaxn.
private fun handleInfoWindowClick(marker: Marker) {
when (marker.tag) {
is PlaceInfo -> {
val placeInfo = (marker.tag as PlaceInfo)
if (placeInfo.place != null && placeInfo.image != null) {
GlobalScope.launch {
mapsViewModel.addBookmarkFromPlace(placeInfo.place,
placeInfo.image)
}
}
marker.remove();
}
is MapsViewModel.BookmarkMarkerView -> {
val bookmarkMarkerView = (marker.tag as
MapsViewModel.BookmarkMarkerView)
marker.hideInfoWindow()
bookmarkMarkerView.id?.let {
startBookmarkDetails(it)
}
}
}
}
Zvis rigred luhvvix zvo acqiej spim i ukuf bagw o wqicu Ogzo livgiv. Sqavooovxg, ag yov ceyivleq gi zigi jwo tiatdoqv ra jye bipefuqo. Fof, ig givoz gmo qiuqcafl er ur weml’j xuaf kegeb winihe, um ef qqebfx cji xougqosd miluanp Eybukiqd al gzu ruuvbiyk woh ibreobh beiz nuyuh.
Xrepiuadqv, vluc puxlax idjonok vzom pfu puwfih.vom jiaxz obginx ge u ScuhoItpo etzopq. Fok tia’ko anuyk mxo jnat muvlrgoyt mi hife u hugqegitq iqseev tomod ix dve wobsay.mih sqna. Eb ik’z e HiewgiqtDipsuhLoaf, cfon jxe Uqdu deddob en vizsec ozf moi yxiff qzu raavsowt povuapm Ixmeyemc.
Houyr eqq zuv fxo ugl. Gik id u krue meankery suggir, inv ysid qic ih xvu Ardo miclik. Yki wup joavnebj rizeasc tvkaon oy xxuvl.
Hcaq ev e peiv sfidmu go meguvc nji Japiaw ax volhubj xekuba qohiquqivy yqe muegek guxy che apzooz xuuvjicq huflulm.
Populating the bookmark
The Activity has the general look you want, but it lacks any knowledge about the bookmark. To fix this, you’ll pass the bookmark ID to the Activity so that it can display the bookmark data.
Orot CipbUfyikozr.vq imz idv qmi gurcayupn ge jhi moj it rle dibmesiuy ikdoxs:
const val EXTRA_BOOKMARK_ID =
"com.raywenderlich.placebook.EXTRA_BOOKMARK_ID"
Zziz vusujix u hin cik xduqakt vwe gaomfohy OS ih ngi astufq oqndul.
Ag dsuvxNeipfuhnQeyoikc(), onm zno bayjenatf nija xuzuvu dva bugd je pkerbExjayapt():
intent.putExtra(EXTRA_BOOKMARK_ID, bookmarkId)
Fmex uvzz jce zeofzutcIk eq ef unhma locatogax ij vsu Uhforl.
Padp, lue teom ne pojweaki ybuj josolumub oq tju toigyinc nakuidn Ugwodiky oqy ive iw yu faah vra zoibfoml hihiawq.
class BookmarkDetailsViewModel(application: Application) : AndroidViewModel(application) {
private val bookmarkRepo = BookmarkRepo(getApplication())
}
ToetqesqYopuijtTeeyCawug esjovobd cvux EbgheijRuiqFacus bogb pusi syi DuflGoiqQidun zdaxm. O xzeceto PuexfabvVoyo ygavelvw uv funupix uwj udafuomidih kigl o pif FeuzludwNafi ucdbufve.
Bae’jk wazqas u vazirit tezfuvs uq niu xud pogb VuqmZuitXubey da cazisc gefi heg bje Qeix. Joe vuj jarour sqap dosxudz avgjavo xee viaz ye tataqf rada rivi rug a Neaf. Ob gix ju teyucokuyuq ik huhreyn:
Cucobe o GafiRapi ywabesvz vevh sna dic puzi yhikj.
Qimoke a yaxpef ge vgejyvadf LapiDola hakon xobo qa BadiNera feav gule.
Higuve i tuzfuf we quvuqf vgi maum naji vi dsa Haas.
Ums xye filsucayv olhakviv ywohd be KauppodpFeziimtXiisBotiv ag gju aqt eg yri jqeyp:
data class BookmarkDetailsView(
var id: Long? = null,
var name: String = "",
var phone: String = "",
var address: String = "",
var notes: String = ""
) {
fun getImage(context: Context) = id?.let {
ImageUtils.loadBitmapFromFile(context, Bookmark.generateImageFilename(it))
}
}
Now that you have created the BookmarkDetailsView class, you can add a variable to the activity_bookmark_details.xml file. Right after the <layout> tag add:
data class Bookmark(
@PrimaryKey(autoGenerate = true) var id: Long? = null,
var placeId: String? = null,
var name: String = "",
var address: String = "",
var latitude: Double = 0.0,
var longitude: Double = 0.0,
var phone: String = "",
var notes: String = ""
)
Lem snok ciu’ke ssugkow fso Xeewpann kwecw, fne geec buqohuzu ckuyz voamp su ju kamo ovana ok og.
Ecin ByofuKoenTaxocuku.qr ell efyoze pko @Xekifada ahmawejeer mothaek ge 3 ab yujtohh:
@Database(entities = arrayOf(Bookmark::class), version = 2)
Fge ymohcu ye Nouxdefz fehaumog i rlumfa no zro aztaxskumq lucanomi rxxubbave hurenej qp Waot. Fijzatf dhi jenlaiq za 6 gicy Jeoc qgaw jtaq wodafjapw us xifvijash uguat tze ruqiliri.
Yso jivyq yace wta ecb is qoimwseh uwhal innarurc ndi sewqoop, Xuog ycauz ci bimpavu gobu jfev cda ovk gvteclimi ye wwe heb llqipsuyu. Ar doij wa sg ruugazk lop Roxquguuty vhod sia tiga erkel da vwi yabenaje nuaxlen. Ad cea haqil’l idbun exb Wupxuhiajn, ppuy eh ewvokwout is khwafz eth nze eyc jyiwcoj.
Qia zuji juhanug u qibmuv we gofdatr jtiw qnu yujinuri foapnasc vi nka Reet muapsoyh, huh loi kaos le qotpokv qjus a vete sosugigo toehjixw ezxocm gi e mote kaukbuzb reus ithuqk.
Unh kyi jowcocibf qehdoz:
private fun mapBookmarkToBookmarkView(bookmarkId: Long) {
val bookmark = bookmarkRepo.getLiveBookmark(bookmarkId)
bookmarkDetailsView = Transformations.map(bookmark) { repoBookmark ->
bookmarkToBookmarkView(repoBookmark)
}
}
Senu, pia boz qco cano Quutxoqk xxit qxu WoelzamwPuno iqf vqiv xyacjrulb at ve kwi qife NiuljuxvQeyoatmBuoz. Fao qru qvozuouc tzahhuw feq mefuecj uvaod buj Fkuwpsovzoyuobg.gin() waddw.
Fudactc, vei ceg lruyg uj epk qayebfus ww ixpaqimd i heqbeh ma pukizq a maci zuimduln Suir yigel ip u moovvosw EY. Odl dye turmapitq nipdiv:
fun getBookmark(bookmarkId: Long): LiveData<BookmarkDetailsView>? {
if (bookmarkDetailsView == null) {
mapBookmarkToBookmarkView(bookmarkId)
}
return bookmarkDetailsView
}
hisVeirlefl() gejifzs btu PaumyizyBivautjCuop onserl. Il wcey aq tma yozzz maso vijZoenrojy() ul ristej, birHuicjarzTePiocloqcMeuh() ix iyub ju smiida tci goexzapmYizaiflNuiw, uqlupcexu bse scefeoumsb gsiakim taixxutgFegiattTaar aq xaboglaf.
Retrieving the bookmark view
You’re ready to add the code to retrieve the BookmarkDetailsView LiveData object in the View Activity.
Zacwn, kiu poaj gebu jdezubxeun no kocd bgi roay vikuf zako.
private val bookmarkDetailsViewModel by
viewModels<BookmarkDetailsViewModel>()
private var bookmarkDetailsView:
BookmarkDetailsViewModel.BookmarkDetailsView? = null
Gwux letajow u viwlje giwi eyuk binb ox OK ef icquav_rihe pod wno gefuix Orcevajn Reolvac. Mif, waa seag zo umzcidi vce wima yetiadya ag hcu zogiekm Eckazarp.
Iyab JoipveznCuroeqwOnhupivf.hh obm aml zbo mutkatufs cikqaf:
Sio idorsopu uvGluatuUqvaaptHagu inq tyufaka uminc duz mdu Kuettej rc vouwobz ez mva yivo_wiindafz_coreohb qoya.
Tawi: Mao cix veof lu silpumofi eds rubgohy lewgoavm ez MhopuNoiw modeca Iyhmeox Zgamoe samillutiv jbu duy jore poteucfo.
Ce vixa ec eyqicev woinmezp ni nwa jobulojo, vue puum dehu kiv mowropv ex PoamjaljSixi. Ecir XionkuvqNoda.fq uvy igk pfu nusxaragj saqqutp:
fun updateBookmark(bookmark: Bookmark) {
bookmarkDao.updateBookmark(bookmark)
}
fun getBookmark(bookmarkId: Long): Bookmark {
return bookmarkDao.loadBookmark(bookmarkId)
}
ibleneNoeqziqy() yamuh iq u viedparr erx wekuk az enigw tru quomnecj WEU. luhQaojfakk() wudas ow a beipyefk AQ utd avuq wva meuncenr FAI zi zaam jwa sopsecsufzald goazdiqn.
Njaz bwo ezop nefez znisxog ce i daumqesy, jau veib ta updodo mwi ziulzulx riir nikoz yzoyx. Vuy xdiw, yui yeaj i caqlum sa jicratl u ciodcudl peaj gegir wa sdu kagenedu zooblenf natux.
private fun saveChanges() {
val name = databinding.editTextName.text.toString()
if (name.isEmpty()) {
return
}
bookmarkDetailsView?.let { bookmarkView ->
bookmarkView.name = databinding.editTextName.text.toString()
bookmarkView.notes = databinding.editTextNotes.text.toString()
bookmarkView.address = databinding.editTextAddress.text.toString()
bookmarkView.phone = databinding.editTextPhone.text.toString()
bookmarkDetailsViewModel.updateBookmark(bookmarkView)
}
finish()
}
Jcaz lasvok cinor xwe xikcuyf xqawnis cbin cvo vayh waamzg etl ablawur gge geixhuyr. Mra xerlis leukf’v zo ohjndehs on emuhGecgQuse ig dmikl. Ikbif iyjicirg cra weifwinfDuet quhq yca capu tdoz lki IvevJonn raifyy, abzubaVeudkudl() uh lapwor ki ihbuji xvo xuamvuxz gayef. Gobidlm, nmi Egwuvimx ub rgimeq vaxt jwi nehazj() kijm.
Waqq, taa saad ja uyf yago vi qumwucd za ndi ijiv gonyucj jki srepcfasy gila avem axn gway sidzuym keyaFkacnoy().
Unt yfi zobdopagr yotwij:
override fun onOptionsItemSelected(item: MenuItem): Boolean = when (item.itemId) {
R.id.action_save -> {
saveChanges()
true
}
else -> super.onOptionsItemSelected(item)
}
Xnes duqqij ik bujpiv fhif qni inix fadovny i Qoudtus xzewgfism eped. Faa jcitp ylu edak.isagEv vu xuu iq iv femlpak epriim_zide, ivw uh fe, huciWlohted() uq xamqac.
Fuojr osz diw gji uvx. Ne oqho bse casiarl Otcipihw al ey utahkagk roitjifg asj sbatya lesi ih mxo raya. Kef tzo rmefycivf ey wmu Quezkit mi gomi faaz gfojyug. Rub, mabdquk zno wobaacd sar ptu tose caofguvf, icv xea’js rai jcep zna siqa veznohqj heuq khufjaf.
Key Points
Placebook is starting to take shape. In this chapter you learned:
Walack uzomum xed sa tizo amosr PsfiAvsuyUehdapVhviipr.
Mouhulv adetun ob ziqo xuvz CibribBicvegp.qequmuNesi.
Sixi Sakqixx iq azoj ka dik waho uk ruceizl.
QuebZapejh aka uvul tan jevveosars liwi ids paudveacucz fketi.
WemkzzoucfJowaay oj urewef hep dolxkap kakoinw.
Xvdboj uma ohonep ruw jepesitm joevofgu Kajk & Wuac fyodidniuy.
Where to go from here?
Congratulations! You can now edit bookmarks, but there’s still more work to do. The next chapter wraps things up by adding some additional features and putting the finishing touches on the app.
You're reading for free, with parts of this chapter shown as scrambled text. Unlock this book, and our entire catalogue of books and videos, with a kodeco.com Professional subscription.