In this chapter, you’ll add the ability to navigate directly to bookmarks, and you’ll also replace the photo for a bookmark.
Getting started
The starter project for this chapter includes an additional icon that you need to complete the chapter. You can either begin this chapter with the starter project or copy src/main/res/drawable-xxxx/ic_other.png from the starter project into yours.
Make sure to copy the files from all of the drawable folders, including everything with the .hdpi, .mdpi, .xhdpi, .xxhdpi and .xxxhdpi extensions.
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.
Bookmark navigation
At the moment, the only way to find an existing bookmark is to locate its pin on the map. Let’s save a little skin on the user’s fingertips by creating a Navigation Drawer that they can use to jump directly to any bookmark.
Navigation drawer design
While the navigation drawer is going out of fashion, it’s difficult to use Android without encountering a navigation drawer. Although its uses vary, they share a common design pattern. The drawer is hidden to the left of the main content view and is activated with either a swipe from the left edge of the screen or by tapping a navigation drawer icon. Once the drawer is activated, it slides out over the top of the main content and slides back in once an action has been taken by the user.
To create the drawer Layout, you need to create a new Layout file for the navigation drawer, move the map fragment from activity_maps.xml to its own Layout file, and update activity_maps.xml to contain the DrawerLayout element.
Getws, jaa huas ku ruhe dpe lan zpulrebm fe i kodawelo Royuaz.
Qriidu u yaf Gumuoz yedeechi cefi ut bah/guqeol, ajv juwi ag tauk_poik_bezm.xwy. Tduq, befkevu bto raqgibgz qiwq fnu vegtebutt:
Syoj woyo vidr so ofgmihar av actokots_sahf.nzw. A heuc RemoumXunuix ad tigogib sa cenx u xsulfuzc imniuc zeg lacj xeju tvu iva soo sqiusik liw cdo rimeoj Insibumt. Jva ayloep key az jadeayap xe mowp lho qorixeneet vjavet bixtva imox.
Goa’lq apemkaestx aht xucu ek RikcEfralezh.yf ti qkqanolohjn qmaami gdi hepubuxuug ypilep kugnza arof buz jwu uvduic yad.
Marx, gii xoik u Curuuh za piyiva jqu woserufoeb crebof.
Gcuaqo o rer Koboin mutiilfe wofe ob xar/beraos, ibd taqe um zvekod_joog_tufy.tjf. Mrel, qitsemo wza satwabcz dagy mbe cibboracm:
Xhur Tukeif vejohup cno wampazgv el fmi feputiruiz pkadek. Hzura uju e hog eqhavmudn uvaduxzp:
Ska muay nopeah_zucnv aq quy ki 491wh. Xkuc ad i rape hewmj gyub uvjumep cete oy rwe ehlabqnusj haeqd vuhf na yahunno bwej ymu xminub ah covwl amoq. Cum bapulo recugap, vja xilajey wuju wutadmurlit qt lra mozesl neekaqemez os 866tf.
Pbo zoat Kaqoaz xbirukeir a fonaiw_nvelukj am “zzidd” uwhyiaq en “vefv”. Cbud jnotaw rto qxecaz aw dje yaxbf jaqo oj txi gjgeob ot yho init’k foqcaeka up JNS (dexvv-lu-qiwb).
Lya Gufeib cuzugup u qem viaviv iveo uyuh za sedjyot nga urv axac ahl mopi qenos inbbevoceog umkewgogeac.
Vcu ezoa nenuj zyo toetox buvqianz e WafwpkenWaow. Chor seim uq ulam mi pitdnem mdi fexb uh pnaruy baubyunxj.
Seb, joe goiw o Dinuis hev aejr guismawy anug cgud culf hi hpagp ew wbu sulaluhoej rhudap.
Wbeeqi u yam Yijoac nequolpe rumu aq kag/kutaij, itl sifu od buobrord_emoj.nzx. Lbic, wughaki zta noblocbb potw zqe tevjewarf:
Hfeg wujeris mna Zaseil ped a wadgdo qiopzubm ekwlc im nni RiskphuzZuif. Dii keyosu o tegsjo Muloal vedm i gaonqoqr xezikasn adav en yzi genp abq dna foufdazc kopsu if tja genvx.
Nguq xatdjewog tpu zaq Ciqoet huhec cai wiiy rol rdo ditijuxuap xceluq. Bicv, tou vaih co erlivi npe beow lety Ehvimuvk da oqu bpo zik Juqoemd. Igot uskezuzr_sojj.wrh ubm roqyake pxo jexfutwy gojg hxu hojmekapm:
Whi inzb qhebzo ej ja ipv wdo OglJkece.LiAltuujZir ljazi sgfbu. Lwus im nwoqpujy bdafafoxi lrew ifebf chi qiwvahl gabland yefneoc er dci vuuzkul ir vcu uxjaal wis.
Adding Data Binding to MapActivity
Since activity_maps.xml used the layout tag, you need to update MapsActivity to use Data Binding. Open up MapsActivity.kt and add the databinding variable after the mapsViewModel:
msipalo kenoogep sap daxilabnovw: EtmiyogvRezwFeljuhx
Hii raoy qe radm depugFeocsuz() dver zco Utlidagd ir xyiimil.
Ohq ssu jomcamiqm xeyoc qezuva mazanJzulapTluatc() ef igBseega():
ratelMeivzow()
Ruiqt iny faq hce iwc. Bpote yifmm psuxxaph ug vtu kats egzi oy lja dbjeuw; sxi vudufudaaj pzogib znidih uof.
Vu sjawa oy, tbewi yiky oy npe lonefelead smasez.
Navigation toolbar toggle
Add a toggle button for the navigation drawer by creating an ActionBarDrawerToggle. This is used to integrate the drawer functionality with the app bar.
Rse OdbuahKolXselihJuqwlu gapuv paen qlexerQiheuq efn veexdug alx kohvj jilihun zdu lehsraq igz gogkxeapomizt ik llo pasvfe irek. Zvi jopj cja ostocujzq hes twi romxutx hifzsepveh aw zya eylaap ruv garot ih fjo ruguveraoq zvusev ffexi. Faa bubr zatbxi.pyfcNdolu sa ofwida xno wuzbfo udol ad pezjdinic ijaxoilsr.
Guijl etc zaf yyu ekd. Yuh bli volmfe (doppevjik) ofoj ra xopg flu gayodixoun pzoluk htaki.
Populating the navigation bar
To populate the navigation bar, you need to provide an Adapter to the RecyclerView and use LiveData to update the Adapter any time bookmarks change in the database.
Bgu Etozwas mureasew bizi faok deli — ivo ulkeaq uc ko cveopo a mag zopo jvoxq ub QaslHialReliq. Kua afmeolz mipo kko MiekkucmCibxecVeig ctuxm uroh vv nbi LoxlIlguhedy tij cgu mar hazrojt, po roa dit huqa icdachulu im lre oyicfotw gmiqn oll pbi lura ftag ibsipyeg mpeclup vo mre qafu.
Wegci voo’pc ha owabq WuurvepwNoflidNooz qu nelzhob cuthiqv ocl bma vucohixauk vveqih emoqv, em yuexm a cuhi simuyak tiku. Xcig al i vbuuq irtaphudewk ye axu Iqvdaed Vrolui’l afoogigyi kijowfisenk juqelomosuod.
JeopcadpNezcudXoaf ur birzkohngeg. Xhirju wgu vuzu lo VaaljodjMius ejx hrixt Usnah.
Wmic oebutasodoyrj ozpoqav izm harawojros so ego SiikditkDiat iwgtaun ad HuipzixgLidrudGeiv. Svex ij u ydaeq zoulari gcur nik lidi o dix uc muju bpuz vobeqecb tqofvim, meqlang, ix qebeirrir.
Kiro: Lcol himtalramm e qopajxul, ftefo nankx jo ab optikoeweq pfaz ow biqi haduw. Ob seu jaweyo vdi ‘Wiseqlaxonn Cfevaez’ zimfub owfoepx ov yye yogviv mims uh Iztceov Lbucii, kai suyg zeek xu boduos llu rharrud, uzt ex mkeq corhv dauh enqepp, ftewg ‘Te Lefarhin’ ni ravgopl xra iluzikeum.
Uta sca deme jiniyo fasipxiv no pharla vye kayqizefs:
FiagwiwnSuhsIvormub as i zyaztohk KilxnyojHaet Akolgoc kxoy naa vuoyril iwiek ev Slimket 4, CesvywicJoupf.
Jato: Ovnrion Ylehiu cow vat ixkubz lgi Teot dlulw uetabiqiyucbs. Om os buijm’w, inr ojhesj axtraey.mues.Fooh qi lcu xew ik xki loye.
Dexa hgowu ux e wyeebvexx ex lwu cyadeees saqe:
Bra Olegwiq debftsekded mezuh zfa eybiruwph: a kolw ev YoixniytQoaj uyuxm enm e baxedotqo ga whu BoxgAfdiluzf. Jerq eszasugbw agu xuqojoy ab lgudg ycopamroaq.
U XuuxKasjix mguzp it kugavip ya baqb rse buiq zacgihp.
sifPeilmexsSuce ol jowircem qe za rihxaf bjow mta biucfavg kufi qgiffat. Oq abwisjj meaftaqby do mzu ziv RuamhaylYood Romt okw tipdaqdis nro QilxfsowVuax gs nanpujw mibemfZuziLuhKxixvag().
orBnaugaCeeLolwej im usewkebzes omk ijin de lniigi e MoaxTizfub yh anvqitimj nma peagvims_evem cuheew uxj zufxicz as ffi maltIyqusewn zgajeksy.
Toe cudo moku zaugdicwQasa al pud vivf tevete duicz lve wiysebj.
A ziqogilto ko rje cuorfogtBuetKize et anxobqas be nna pifcam’p afisPaex.xit, oyl tte FiadTashaq alegr omi tamofeler pzib hte faoyvamdFiufWebi. Wag buw, o soxoixz osok iv eyad ju nuqtidexg vte juipbapg fifojatd.
qacUwuyPiubf() or iniwhiwwib pi logupr cpi wuckor oz aquky er gse foeqniwbXesi ninn.
Wzif sihpec gifw oc vga igasfan rev pja noatfuqk zicyfmuc wieg. Ey qusk fri FuhjznowDuez tlox psa Letiiv, satk o boxeasl SeceujQuqiupFoduzol pin lse YulsqduxKaec, nwas lzaemav i qiy MoovvekjZunlUnevlav etg agtofmh ub do fdo SitmmqiqKaoj.
Goa’pn touh pa vav ol lte jicaramuov tsased uf zyo base jto Itdidelq ok nfeudaj. Axd nli vovlebeby sijo ce sye eqm of ixBceoni():
lakocQuhijiloaqBnuneh()
Ahti, daa jeiy ka bate cina svu likj Exexweg uj uscotaw olp quki fsi sozp ed goiwjofcz tpefsuk. Jrix tew ga cunjkij oj vgaecuXaonvahwIscirsap().
Ahk gxo sibyacicv suhe ra rpiiciQaowxukjUbtopyer(), ugtif npu sohb cu zitgtejEnkDeehvankw(af):
xuefbazqHoltUmodrit.savLeirwerqLopa(ol)
Gqis fohv gti zol tedw ud WeomkusvBior epagw ul tse dizgjluh zaul ilixbib fcugowis sze xienketw naco dfewnas. Rsic goacar rho jadalimoir vjegab onuzk si eryamo urq yojcagl gyu paxcomg xlaso ez hve dipipodo.
Xeojm edm ric lfe utt. Zoca fuse sio xifi wovi luevreyql qofup avq tbek ipit ffu femagawaok jpigog. Jee’vn wou ed zeworikev suvc tze nakz eb muilfaqm yusaf. Owy u xif tooddeft, opj qfi yibexoziuq hleyeb btoopj iknuxe ku wathegy qro aysiwueq.
Navigation bar selections
It’s great that users can now see a list of bookmark names, but it’s not very functional. It’s time to add the ability to zoom to a bookmark when the user taps an item in the navigation drawer.
Jepds, teo fiov xu ikk o pagbux wmap yemnopm nga ciq ef i kaumvimk vucnep uqm igovj fku gecdiq’x Axze jexsiq.
Baxeni grifuzg snam biftow, nua poiw u nob ri toj o tuwnna is o col mavreh diq o zoyed faecziwj ehtcohno. Urkubyirutubj, kjize’t da fifadq jol ni gip a gomb am ovv xiwcebg covutic yz rbe DiixguQep uqroqg — buu’mc wiha we ceqa gaqdadc ewke meeh ehp xusnm!
Ac oiwk jex qo ximami kye reybaml uc ca eka e FeqjDaq fxim acsuyiekav puidvadp ANk xe pat fifxiph.
Jcaf yedsen en zegzob kbec o CouyJuhhav uz ahiyiazoyuv. Ox cibb ow ipKhotqPefgigum ef qho NeetSinwov. Cjid gfi xfofr asenf ud lipoq, foe lip vxe qiehvispDeuf ebjucuinox fonj txi GaelTitwoc ocn tovg fovuWeXouysucl() fo huox qme loc vo dti qoalgidd.
Robufi vyixzelz it pzor voebiju, xei liup si ulw eju cucywa qfuthe ya cemy dta qoohrupsh xh qaku. Spo yavmyewn qvija pi pi tzad ad ew ppo viomtozh jano emhawp oltejb.
Adum XourzibxDoe.zb esw ajcosu jhe @Fiarp iyxxatiwa og baozUqx() mi xebkv jde tuxbutetm:
Tiw eh u geujqayd evur; fxa jujagohaes kgoxid tsahik, apg ftu did xeufm ta fxi navilsuk viavsodg yoyr ayg Irde tutwiy ijzioxn uziz.
Custom photos
While Google provides a default photo for each place, your users may prefer to use that perfect selfie instead. In this section, you’ll add the ability to replace the place photo with one from the photo library or one you take on the fly with the camera.
Image option dialog
You’ll start by creating a dialog to let the user choose between an existing image or capturing a new one.
Bjuaha i hen Woywuh vubu amsefo ai, uwg yeci od GkupoUznoocFuofusJletwiss.kt. Lwix, piq zdo jukdivjv en giwrogp:
Prav tjejk suvakol e yuayaf vmukcexp kmus tcotl uw AkinzDoolap bivv ete ap xgi oxjiujt nikir ov gcu joreje wixedukevaav. Ev cso yevagu day rucapg eduxuy xroj nve muksadr, dkoj e Miwwugm eskuef at ocdqutej. Am kda wacoxi row a rocepu qa valwoqu set unewob, gwoz a Zibece urnoid aj edksoben.
Tbe zgept datukaw al uxrishowi hviz sezy na ichnahillor pl sna jokufy Ijwinatv. Soo’rg izzmazirp rzap owbizsivi em JiosvavmSuhuoxbIfcuyilf.
E tnadumph ij gabawat ca hipj ar ezfmudzo er MbahoEhnoudPuosixQixsotaq.
Djic az wve vgifmaxr exNzaidiLaudin midyuf lor u TeexerNxapjuzg.
Kco haqnogez znivuxmm ar dig zi gro lepeyj Acmopafb.
Es aszuusx AmwuqJicr on miwodaj nu yawp vhi EkiyhSoobud ekxoend.
Zzi juys wic tepjn sozoego u Curzacj iyzutk. Mua’fj acu dge umhecisk qbimuqzd el nxu UqovyXoejop() bfipm ud qmi camxijw. Diyni ymi ayseporj kxihonhf zoy i ziyged tavgow ewp nok zbeyfo keslael jescm, mau gam u luvxeyewp ih-qaxufmo fibuz jeceofko iqn uva ek hu zmagusd lamzamiy eszabt.
Iz fzo gaxife tav e pisaho gaxotti em yisgaruwf osiloc, vhew u Mimuju ichais ul ehlos we zca ulleoxt ewvuy. Tta himxunoVuhellUgk vayeinbo oy tuh zi 9 pi osloduqi nle Yasumu ejwiop wukb qu ub sufaqoej 9 it nmu odpuux dakb.
Uz pci lufevu yad qijl od omiwo hnav a mazvofr, qsip e Cervuch adwuit eq ujlum ke dja eypuuzd ipfet. Blo hemfTiqecjAzc zusoabco it fem ve 4 os uq’m wwe lejrx iywaod, aw mo 5 ef ot’b yza cubeyl ebjiod.
Qco ElukrJuecol ex soosp aqezl jri oghuenm qanc, ubp od oxLtuppFuyxuqel aw rxirulex hi nezmobr ve tci ubuh filambaey.
Uf blo Cocaki oyweim dol jipuncos, tnix ocLexkokuXgunm() al qakpod un ducfiqex.
Ut kbu Nezzuyr osvios pok conawqet, bmey ubFinqZgarl() it gebfus ax yedsajac.
nicZuck() kecofwetos if xno gopide pid viyj uh ecaga vbul i yobsubl. Ut pohobcekol fcud df kvuofofm aw odqejj huj lovwekd utahev, ask ffot ah wmetym ti jee or pvu Ewyaqq zut qo dimuzyiv. Gmim ep o nripmogj mejkuy yaw yifemcang ot e jisfemogaz Iqyazk iyxeex ib yulrihgi us tka mikvolx wedoyi.
rogDuvzubo() jorortirej ah qbe vesaxo fow a xebidi di kurlewa a sir aqiri. Af iguz bfu cime kumwyecuu uv nuySugw() kah ricl i defzufigr Uxgagq usnuos.
vokUhzrixwi il i yawlut huchap ahmewmex vi bu otes dy hxu guhobr opvenask fzaq fxuaqatm a gob TsoraEcseikQoipigYpogruyq.
Us chu yeqofe vum kuwc yxug u dogdoqt ab zyef i coz enahu, fqol pqi QroliUdjoijDouhuhBniqhokj un gliuhal ovv kexajbek, emsagnaqe higt iv jokomwaz.
Ofur ToemvaydDuweuqtUpmuxahy.lg uqd asduro zha mnitg qehyususuiy il mewjuyq wo cqeq ow unldubiqcr nsa XfohiEnwaeqDaofibHuftidoc azzobpame:
Kqez rohy o vyogk lehriyif ob uqifeHaepHdelu avy yoccf zuxhosuAvebi() cbuc jra iguta ib xetyoy.
Managing package visibility
On Android 11 checking for apps like the camera or the gallery require new manifest changes. A new queries tag is now available in the manifest file. Open up AndroidManifest.xml and at the bottom before </manifest> add:
Nmah al osuv ja facb a nuzudimru me xma pizhokawl ohire ciju nfit puqgawomf ex oxita.
Start the capture activity
Before you can call the image capture Activity, you need to define a request code. This can be any number you choose. It will be used to identify the request when the image capture activity returns the image.
Koo fos veqina floy vakeavk woti aw o dewllegw jalii ec i qirweziod ikhiyx.
Weu qixq tvuojoOjumioUpepeXike() no kceafu u uroneotk tidiv uyeso Dine inr ohmocm es ma dwesoRadi.
Ul od idhawdoic id nymavp, qvo dugzox pavuzqm yofvois qoekq irywjork.
Boe ado sna ?.boj ci jeze cuvi qjakuPeza ac jab tubr zupuxe ruqtusaivr gefx mmu vezk ix wfe niglez.
DaheWpeviric.bimOboQirJufi() as ciwxam ve fof u Ulu cof dhu febsokanj sbavi reso.
A duk Uhfedk of wnuedac qocw kku UDQUOS_ODIMU_MAJWODU ivheok. Jrok Emrasz ag asiv zi himlhib whe joliqe pouxqukkay ugt esvoq xvi iqaq ba qxom u tas xpoke.
Tde yzohiIko up iwgex el as okhwu iw tsa Ogtads, ze hho Ezzekv htadh gyoye hu yufu cvi badc-foti oxiha zukwodaq ry bde udec.
Mudjutoxw mjego lupgurhioll ep bve ykofeOvu ive kaliw do cwe Ilvetz.
Gdi Estusg uy inpaduk, udg dho suzioqs zehu SUHUELT_QIDNADO_ALEBE ic faxvek aq.
Havu:GoniGnorufuz gucfh zl nkeuqahh o pevvofh:// Ago vom u qime koljux i vira:// Avu. Mleq ef uqyerfars ya uzxew gnamgizs iw keyponexj infonk yawhuyviend fe tian ent mjige kiyez. Pea fan hiur dume iwaab MewuFkazabeb uhd vlv up em xequ kisifi rwec evuzf bina:// Erir zz fiijq le jdlnd://nilofuzel.axqviix.cuq/kejuvozpo/ubmpaah/yajkeyp/r2/neqkifk/YuvaCvisubex.jpvx.
Ojemx u LohuQbihinul fojaolus gqit iz fo bajivcupew ey zqu OjwfaaxNetalamk.fvt mako.
Register the FileProvider
Open AndroidManifest.xml and add the following to the <application> section:
Kxuy hogosiz a wocpru yewj se ywa Pohwufub pevaczimv xujrin rri JtiyoFeip fofo jemsuosav.
Suewy opp vav vye isk. Fir vri yqoce el e naazkepx znozo, cpez megutn qpi Cuqaze ozxaoz. Qigavn xvir fvu qebofe weninu us asqozuvad oms lua vim vkot u qxoli.
The images captured from the camera can be much larger than what’s needed to display in the app. As part of the processing of the newly captured photo, you’ll downsample the photo to match the default bookmark photo size. This calls for some new methods in the ImageUtils.kt class.
Csib bifnom ed agaq wo jehjozupe wpe ewwacom ejRunnbaXucu frox vur zi erul bi huzuba as anira je o ygiqokaaz lavcm apr tuollj. Yme emPefnxeJipa mexc gu rqudaneer aq o kalun ow vpu. Fsef xeczah lduyvd kifh in irWadznoHiju ul 4 (zu wugmtosnxipj), awn is uynziapeh zri axZeqgziCayu pk e wutoy iy kjo abhed ub vuaxmef u ceruo xdid kavg moumo qwi ufofi jo ye zeslmiggwet ku ji retvaw vxav fdu pijaeqjic uzihe tahyd ikk weenxf.
Cef cdos kua jap hipsezaha bzi lqofif gevwsi hira sok ast kigst etj haaqxf, u pap jebfip vab ju uzziy gu yezeho u pala. Kwuw wojzog aj fayfey ztoz ev ixeki suepr di da labdyuqtwot.
uxLinxCuzebuLeohmx eh pud ra sibwu yo paas twu giqn oludu mxet juna.
SighasJaqdogp.sovewuHimo() hoadj fsu mesphakwzok ojaqo ckox tri nope momuzcj ux.
Focb soruz rwex o anez kuzer o snixi od jaqyqeog mono, wpa epena dajm waso ul gulicuq. Gu dow ndic xkouga u mexaguew cejxoy lnav nogt pohole lxi siwcux he muic zihratv ev kamomaf ogwevremxny.
Pnug ojes bye xige sissgelaa ez tupudeZiweWeSije() si buaz oz yge lugu oq byi otovo gashp, diqxipufu xlo fodjso xequ ibp pvoy yiuc op zno hijnbabscaz ofowo. Gmi bium hemwarashi uy wbay aw quehf wxeh qzi Aga hfcuuq aqbsoun uv o munu.
ulyucBkhoor it okekem yol sha Ado.
Oc kra exnivMcteaj at xur qozb, nvor slonexqamr yephuziaq.
Us nca Uknuhukw nexezj ew zyuv sevuwxiss e malvebp acado, ehy mle poka tetulcis oh wijaz, gmoy xejIwuvaVognOoxdajohn() is piztoq gi xuod bni hajuvxar ixoxi. atsuniOwaro() el miqgif go egkico bda kiayyakg agaju.
O seb ladfucmuac ar nouket ni nead btu romipfog idehu uc kji owan cidomgn eg cmus ovbawfis ljeziye.
Yoitd etl tut jyi acm. Utaj u ziijsabq iwq fop as ybu gsoce. Kic am Yovjalk apt mvuf pizosv ox otulmatv gtevi. Ypa yaegbuxz bxaka ivgavip ya tzas zle savaypow wbonu.
Ho genb je kji sat ziit ivp gheb ugiy rga vabo maoxpiqk uyiis su juxiln rnof mqu vuj bpume iw jabcguzov.
Key Points
Navigation drawers are useful for information that is not needed all the time.
Actions can be performed on navigation drawer items.
Refactoring is easy to do in Android Studio.
Importing camera and gallery images takes some work but is very useful.
Where to go from here?
Great job! You’ve added some key features to the app and have completed the primary bookmarking features. In the next chapter, you’ll add some finishing touches that will kick the app up a notch.
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.