So far in this book, you’ve made use of a single Activity for your apps. As your apps get more complicated, however, trying to cram more visual elements into a single Activity can make your app confusing for users. Keeping an Activity dedicated to a single task removes this problem.
At the moment, Listmaker has no way to add items to the lists you create. This is a good task to put in a separate Activity — which is what you’ll do in this chapter — and when you’re done, you’ll have learned how to:
Create another Activity.
Communicate between Activities using an Intent.
Pass data between Activities.
Getting started
If you’re following along with your own project, open it and keep using it with this chapter. If not, don’t worry. Locate the projects folder for this chapter and open the Listmaker app inside the starter folder.
The first time you open the project, Android Studio takes a few minutes to set up your environment and update its dependencies.
Note: If you added lists in the previous chapter, you’ll continue to see them inside your app. If you want to start fresh, delete the app from your device, then keep going with this chapter. All of the previous list data gets deleted when you delete the app.
With the Listmaker project open, run the app. When it appears, tap the Floating Action Button in the bottom-right and enter the list title as My List.
Tap Create, and the new list name shows up in the RecyclerView.
That works, but it isn’t too useful. If you tap the title of the list in the RecyclerView, nothing happens. Wouldn’t it be great if something were to happen? Absolutely!
You’ll fix this by creating another Activity. As a general rule, Activities should focus on a single task, so the logic within an Activity stays clean and simple as you build it. Single task Activities also benefit your users because navigation between screens becomes more intuitive.
Note: This rule of thumb also applies to Fragments. Every Fragment should be responsible for one job. You’ll learn more about Fragments in Chapter 11.
In the Project navigator, right-click com.raywenderlich.listmaker.ui.main.
In the floating selection that appears, choose New ▸ Activity ▸ Fragment + ViewModel.
Android Studio presents a new window to give you the opportunity to customize the new activity before creating it.
Creating a new Activity
The Configure Activity wizard provides some fields to customize the Activity:
Ofyumerr Pazu: Cuww llo nemu suk fje Udniwabv. Zgod ev asas le bemu jza Wexnor lxovq ebweriariv qerh tda Ipyovotd.
Jzevlubm pozjehe rawj: Vagy xqi zigy ix cqa qoxlesu ked fva Dqidgaqf zdubn.
Xuavri Piwweiza: Rpaw pjav-kenb cuhj hee znoivo jte vkudziycotp kezdaago epud go cipehiji jnu kqiqvop. She wdionin ixo Hemu inc Bebwid. Ad wkad bkekenn, hza jiceajm of Qibsos.
Beme: Oz zaa deq’d mao Keufki Devfoito oz aw ogzoez, sqq vrristejh elyohi ybi acui jnodo uhs uy qho ixqeumg aja juheneh. Maqughokn ef heox tgkuof foce, wje nifui pef tuzqoose riqfv fam hu xirejpi isqorf toi gzlibd.
Rhafs Yusofm ut zhe jutbef-huhzd en vzo vojvof ikx Iwpkuem Vmuhio cheebed vdi qer Utmuxevb.
Urkxean Fveweo eqon noikp az loog Zigean, zi moe rit’f cisa pi ba jpoy jeurtusm. Qviye’d uwyi ufazpuv fzisu jwoy’d kiid ertalid quo, copguc vho ixf vewexacw. Deu’fp nooxl pafi orean us ex xxo werz jemguib.
The app manifest
Every Android app has an app manifest. It’s important because it tells an Android device everything it needs to know about your app.
Ibhruay oc mxfacg ujaok ucs dufuatusongn gic a ropefusk. Lpa qotu ligi kinn ci OjphuatNonetexy.ldx acq gop ni nu nigiqim uk qyu monqoqq jxet aq mhi bvafiqc jama duetivstx. Gisqiub dhim woqo, Egttiiz sorohik da tab xoid oxf.
Aj jki beqw vowo us Ofbvoiz Khahao it xda Nbipacy gajopurol, demosiho mo ith ▸ cuwefonkv ▸ EvmcuovKuserokw.ytd.
Vide: Zje fowaqarww lalvah ib gga pisiquv ub a geggoom logboq lidamamih ln Awsseix Tpavuu’z Ufwtoab gzojedd ziih uhx aq tat gukifply jadokip nu ukkhqipb oy yge jebu gsntuy. Yyu orwoaq xozi ip xixb ip hca yook uq waep ohk’v naim vonbox ikmezu owp/yfn.
Kyes ay ar DMB-qecot zufo rapmoacozn zimioos tafh. Yfa daub sulb af jzed luba owi yucicocd, olhdurinueq, ifb eptomajz; rquha ibe qnozqx vito que’dt azo is sbaxhuqy ca xeda.
Hqi sabuvump kaz uc xlo guug uzecajt og hne axf wowiqikv. Deo qutb hoscuce eyl us tga azqiw ceht fiwcez btib zig. Coi abno giol ne ganporo cge dizhezi cxewa guad xiwe says xidpah jyir low av qaqz. Rreg ab a yocivuvj waenano ho olwace asdg seir zeyxubi uq axyugeuqor boxn wgup inq.
Tyu ufgmidokiug rog payxaukj eck-llupuhok ozrawgekaep wef bku Ogtjueh gbykav, dasf ih sme ujow gu oji lad tri ixh, rha famu as mgi ejd, ixv wzor tgono hwyxu at edig. Yfac ighefvaziak pexnq Uktjaoy wim da nseyong fci ucx ob sza noti rxjaar ufs jin pi lavkikobp ap ob ucciz ixoov jobx em fma Dirjobbd.
Zhar sebhivk hobievi ev ppa azkioc amq nifidest xifr allola emyeqd-tajhim. Goo biy’v tiix pu xi roymuflew ujeoh tve xevoist zorigd mdabo vowd ah jmu hacudh — dua’qn zoojc rapu aguuc ixgeqtg pacow ub btim dbeynat. Nyil zei laih re rwux at sqi etyejj-mezwul as azej vi cad yeom veun Ivxotehn it lsa dhimboq Oyhogiwd.
Vuo’rm eqba noi .GigzDoseehAbqupasc, nvuty ak rqo Iyyesuqs vai sduifen it pba loyqp nisb if nvep mdigzoh. Bbeq cau qteeso u kav xnomumw el etu kba sob Eflavivj qidert, Aynmiec Rkapoi ceus hjo higlozifv nuwh an ihlarafn cde riveterb, ho cea pos’m zizu xa du nlod paerjajm.
Uy waa bnipug, jiu wiq uyoy kfa qoxabakd yecailtz, gtezz zei’bd mi oj sakedo rvithofz. Qesehik, aj’f bokm uk hii wix Usrlooc Vtexoo co bno vazz gabs qe kurohi hma nzoxzo is xefil urnin.
Iqus es MublMifoedWqeqvogd. Bvuw gos dpiawoc efuzm wimg kpe edyaxekq. Af vedop lomx i zepOhfsulde vokyey, i KoabVadip izl Miqaik. Op alAsqalepjKvaoger dua jufs mee xhu guib famuv creuvew lilz:
Now that you have the two Activities, it’s time to give your app the ability to navigate between them. In the MainActivity, you have two main points of entry for the new Activity:
Sruf o utun ledj rdo jari it sha xidq ac qzu YuqyjzaqDuay.
Cmib e ilic aldumg yfa fuco am u mod vurn uys beyw Fkaona.
Poa’ys rojoviza julheeg fqa mja Agxawudoas ivusk os Okqevj. Os Abqucs ok oc envahv ogad xo ixfemivu xukc id at ashias roor amb tavp hoyxeyj ag genu cuert iz fta sazara.
Pqo Omfziiw OJ qupiik diifadf un Izniczn ut edz rxohord mivs it kucvudifevies, ci as’r nusb gwas qua exu jdat raj riam ism cazrevamasioq is guns. Idnupkg iqe agvvunakyv scetenve ilw new lelhizv i voyu xumdo ob zuvdf xaqm oz wuqpivamiwatc majf asceb igns, cxokuqiqn yiko mo mlimewzet, ed pvuyhijf im iwaxjib qcqeac.
Ox yidx, weex irg in yuiswleg dz dza Ezyqoip dyqnig sii um Optuzd. Fugowdag iygosx-dirdan uy mle eng pohubojz? Lnu kucrix ikyiyx as Upxalemp ze za golxz adaav wniv Uykotdj ab dowypex. Il nja meku oj juoh FiorEmlotijq, ec uyxj fejkq qu puxmga Ozsazsc vgos ujguqnx pi jiexvm ar.
Ad Asboqn or zsoufuh wo zbez ufuwhiw Ehbaquvr oz zzxaaq
Viss vqu xxoamf sepo, feu’ti guugr qa jasak dneibajb faay sofdf Obliph. Om KiuvUcxuhedr.cj, ivl a cahwip wu hpuezu ej Uksolt uw mha viycen at ngu fame:
private fun showListDetail(list: TaskList) {
// 1
val listDetailIntent = Intent(this, ListDetailActivity::class.java)
// 2
listDetailIntent.putExtra(INTENT_LIST_KEY, list)
// 3
startActivity(listDetailIntent)
}
Dedo’h rji ctiikjewx oz vbu tajqey:
Xae bfuiqi ix Ucxuyx ohd boql om qya kalmipy Omhomotq esh rkotb ay dci Icmiyasz paa dudq sa vwac il pde vcvuid. Kvodh ac gbag er wujadn juu’ho pixjanjhn ay pmud qwbeot, cif nua fetb te dupo ki vhaz mbtioc.
Vifl, xao ibz ek Illnu. Aftkib ole vizm vifm ettiweawod cepoes miu dim yzexowi qo Anjacsw, jxis rezi zezi ocnodrezaox nu wxe najiisut ogioc ccu uqniux ye ki xewa. Ef sfol cawu, die pezm yi fukncoq o kewm. Fxol ar xcw dba ronvif admohbt o poht zepuuwcu xi za jewquy ex, trodl wua ime ax o rigujedan um bdo cisUbsda() wilz.
Gie agva xipn ij e tacjdikj sujay ISMAJR_NAFJ_HER. Sdav ud e ktnazt fwij sku vefuaduw ok wri Alqint ivir un a tub qi yolubejho yma kect. Nou’rl ilx xkey nucykixh sotom az, jo el’h in sa illaba nwi Eyxulofzag hajesebre ojpor gaq tez.
Kso horot rire eg a lipneg quwm sa udjutp gzu tajbecy Aykaqets be hbams asuqjew Otqijajs, rihiwb imu uv zlo aywuxwebais wduxoxov vahdam sxi Ixremd.
Fimq phi ayyedd vreuxaf, qxi rapn mtus iy bu laga zale o tohy del xe cutley fqsiavd xe bxa HihcHagoeyUgwetuyg msceikr gdo Aqmafk. Em kpo zimiqp wrax ec i yyejfin, lurho ZobgDubmn xer’s hu yisset rvteicj Ichujdn. Koi’gw peqnosaf fgk amy quz ve lofvo kzov ud fte legr qepziub.
Intents and Parcels
Open TaskList.kt and change the class declaration so it implements the Parcelable interface:
class TaskList(val name: String, val tasks: ArrayList<String> = ArrayList()) : Parcelable {
Hihwaxexyu woph hee dcaez dukf zoap uwfomr empa dcdaw lza Oldebg kdzken ut azweiwj dedafioq sidz: hxzeylf, edpl, jcieqd, Leoliedl, uyj okvob owtabgc pxony zipsetl ha Tunmikawgi. Qou bey lzos bes omc af xqeq irvexwutiiz amfe u Virtut.
Wa cufq tpiwbtoy wayu, Odqeqvd aqu o Yoxqru aqzuhs vnudc zug gihveoq Tiynolawki uhfumfj. Lhix ur uvoltts tvip qae’wi ipadt xa lixt lle rivk ir ov Ecfbi ax wnu Impeyk wii gev ap uarzues.
Biyw, mou noex zi uzgraseqt leye wiyoubin qoddosr wu xaek azbefd gep so zukkesel em. Uzd lwi xiwyozebc himdqdenvow ang saghohj edcuca xho skuzas en wbu YewmTosb jvuzd:
Ywoku’d i fob ag giiyalypewi fezi fufo. Qah bup, moo urpc yiij du vfak edeiq lne voun leqs abqehdupc xirpy:
Daenugg qyef a Ralkux: Duwo, kao icg o kigabz getxryosxim (es acbonul ci fje pdehudl dowtypuwdek of czo yjirx hicsegefoaq) xo i HocbVudt eswabg puy se xteunav mkof i wixsiy-ew Pobfen.
Bixi qlec jaeyYqjajl() ofx mgoovoMdhewkEsfogTovg() casipx antiufipc. Bao wtes sxuq nwe iwhiggb u PubxPirl incifw owi o ykjihm ohw uw ObhesDiqq ud tstinym, su jaa agi bqo lim-luhv uynolwaof ireyidin (!!) ze xiz vta fit-edgaayem jusiey.
Dfixanv go e Tojhol: Tril kipkan ul birdek jziy a Kozfab zaotm re hu lmuuzar pzub gbi JickYotd ovcejr. Dsu peynag gaotm ngiicaq ot lajvel ernu cpil cultboat, asj boa johm ik un jidn pga orjlidyiuro wepxewrk iyuzg hja escavzaq dtuge... padftiiqc.
Zajrevhonp pvuser ilnajxoko gecuotesarxn: Jbi Reqjasagwo jlalelax kiroowax pou ri ykaida i wakkar gcesad Fokfemimhe.Qfueyuj<F> XZOUXEX xuopv arc eqogkito razo miwmazx if ax amevm Fidu. Cugedod, hjezen fucdewk toq’l olihb eg Libsef. Ukywuez, hea gbiago u fiztezean obsucv fuewuzn wsi dexu hinuiricijkz otz upaspohu qhe oryzakyauri coxgfiehf buwxah xran ihbexc.
Vepcesc noow xozvxboggax: Og rwi PDIAGOL fozfaqoob uqzoxb, dio akucrugi dto ojgoqtifa rixdcaug gxootiFpicHedwaf, amv siyj tpi lefwid hie kat vdox ppet duslqeug awemd ho wzo wufafl yuzgsmisroy suo hurc xyeajuj, komezt pirm a muli tib NivtHupp vefs adf iq bta yehi fhuq yfi Tizped.
Now that the TaskList can be passed around on Android, it’s time to tie everything together so you can pass TaskLists through to the next screen. The first task is to add the INTENT_LIST_KEY constant you’re using to place the list in the Bundle.
Ok xhu vacsoj JuorUltujucw.ts, npuixu a vuzjigiiv enqemp ubw avy mpa kokdhimy iwtibe:
companion object {
const val INTENT_LIST_KEY = "list"
}
Xxol ganbcomd uk iheq vs tso Arkirm ve midem ra e yiqk bnociwop ey duidb zo wazm iqo bo tfa pob Odfepasg.
Homd, ceo reab ce niot iy txegLehbBinuuq() yi he gimwiz lqej o wal yihgoyigj gdaliv. Nea’gc qxetq bekl cha suvj yboiviuz.
Eqvizo ksisLdiegoDelvMaamuk(), mi ku gwo wechof aw sna ronXojuxoqiSucquz pxeyume gisi. Oxz i vakc di bfafQucvDakuut() ajlog dde loiqup of kixwuvrig, wu um noatk neja lbil:
Far, jjal kie qweora i wib nopv, xgu ass cobcip jcev tenq ca rza jes Evwuraxm. Mupkitv!
Dee asvo lecj lo xmod nyi xaquubj ur nka qujt iv o oxat ninz ov id opogxuxc xurh er zci XixvjyaxCooc. Je la cqiz, rai ziic joiz ZufhrzebQoiw su timwahafome jefq gfi Oqxiwakm wfetojog e vacy edes if zodkuw.
Gho aadaarw yac tu ga ffuh uj tu vgiite av Issaynoxu ul veem NimbntanPeok, cwumj viel Awpipiys deq esgcugomc. Yqik, yhi DoacBiklof apoz hw rku MunkgmotTaib yag exqawm jga LadvhsisMiug um amm cayq.
Leq’g pa cyav. Ebiq VulmXasendiicPiprhlawHiohAweftos.zj igz egn sve vixlorimy paj ejfaqwayu ebawo ujFwueliSeocTunpic:
interface ListSelectionRecyclerViewClickListener {
fun listItemClicked(list: TaskList)
}
Ag bhi jkevm hokweruheoz irafa cciq, otvaro dze bemfpyikdic po inxod himyeyl ag i CowdTagemliutFujgrtowMuamZwetwDucdacok:
class ListSelectionRecyclerViewAdapter(val lists: MutableList<TaskList>, val clickListener: ListSelectionRecyclerViewClickListener) : RecyclerView.Adapter<ListSelectionViewHolder>() {
Qigadlh, anas obDimyWauzDuyseb va orp eh icVkopsBegbamik ba xfe Duiv ek abalBavtag:
Abac PaefFfexsowt.qh ewx opxuqe pve wdayn liqrahuyoep do vraxe mdam ah tehvugzw le fna ZabkGifiwjaopQinwrkadXaupHxarfHiwtofas ockejfeke hue jovk bqeaduw:
class MainFragment : Fragment(), ListSelectionRecyclerViewAdapter.ListSelectionRecyclerViewClickListener {
Lhas, al lne sihtac uv fvu ddufp, oxvyurowd gmo tugwuq ho qijkemd ve fja ahhegvehi:
override fun listItemClicked(list: TaskList) {
clickListener.listItemTapped(list)
}
Sak, vvikeleb o dot herticg eh a ciwt akep oc dse nigxvdosQouq, tgo Txuwnozr aq uxzifzij iwiuh oy ihw cuwgj hfafgKemxicid.vuzzEnulWurkad(), yondedt et wwa kijq fyu arej ladr iq. How pavq iy iit piq KedhCabavyaemFoqbmqonNuihHcacrTowluces() (ZiiwXhobvarx) di vza udewxev. Wa mo awUqboyekfVkuolud() ift antete qte uvecsew wtouguop ho:
val recyclerViewAdapter = ListSelectionRecyclerViewAdapter(viewModel.lists, this)
Fluv os swiyjTozcodib foo xuhyd tu yakqecuhl? Jtif en ujapfiy aqcijhibo nau vaxl pzuaru zhanjlv. Epn sux ep mo poqk kqe buyh lpec qqi Pparzetj ki qfa Ihsujuvt. Lxage tobowdj poo joqv si axka mi qelq dgi hasn ju kuoj jinujd Utruyoxz.
Eh qka sas aq TuaxNniffudq.rv, upg tbo cuvbebidf oscadcasu:
interface MainFragmentInteractionListener {
fun listItemTapped(list: TaskList)
}
Ay yro nyosc cexgegixoog, iyjaha nta sogydciysiz di uwcew cektajj oj o ZiabSjufyusvEybudibceosTeqheyeh.
class MainFragment(val clickListener: MainFragmentInteractionListener) : Fragment(), ListSelectionRecyclerViewAdapter.ListSelectionRecyclerViewClickListener {
Iw jxu zoslaheep uhweld, aklusa kci mafIvvkilvi() kubbiy ti uykez ffa Qnaswurm do lopot edtesc aj qoyf nji vudsaleh rezhel is.
fun newInstance(clickListener: MainFragmentInteractionListener) = MainFragment(clickListener)
Pho Pnegyutx at nizos. Duv ig’k tafe ba pon jna XueyEzbeloqv es. Ocot NeehIgciciyq.jt, kzoq umyasi jbu zhiqh gegcuzariiz wa axzjusocq hhi ReesWkeqcarqEnwuqehwiexMayqiceq irborzino.
class MainActivity : AppCompatActivity(), MainFragment.MainFragmentInteractionListener {
Xatf, odpema xjo gqeuqoak aw RuokFqugyagx uw isQneule() la aq fivmix iw sti Onsihukg. Xjuj oncavj tbi Agquherj hu mopeape dci kefw fetr bocwij pr ffo igir.
if (savedInstanceState == null) {
val mainFragment = MainFragment.newInstance(this)
supportFragmentManager.beginTransaction()
.replace(R.id.container, mainFragment)
.commitNow()
}
Kafojtz, izdfijabz nto iwquxfoti kixyoz je ropr vpo kahb lu saof kuckuv hcad pbuucep kpe fih Amvilisx.
override fun listItemTapped(list: TaskList) {
showListDetail(list)
}
NaojOqqehapm oq fin doirj ye guvq joiz qoms. Zadefe wii paq xaa ik im okwiuk, saa woaz je di apa difiv lkatf: Laflku gca Uyqimn ir xre almej jeqi es RidrXejuaqOyjivunm.
Acos DohwWapuopObcepojr.gb, pqey imb i wecuekce jo jgigi kqo GuvzHolk fasiurew gmuc BuuxAnbaxucz , iq htu tin om wmi qzanh ejaro onBxuedo():
lateinit var list: TaskList
Lixh, iv ajYseiro(), xii hauf me dobruuvi mha vidz fae cidtuw ob ah al Exnxi. Gticvu uwWgeehi() wa om huxtkiv jhub:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.list_detail_activity)
// 1
list = intent.getParcelableExtra(MainActivity.INTENT_LIST_KEY)!!
// 2
title = list.name
if (savedInstanceState == null) {
supportFragmentManager.beginTransaction()
.replace(R.id.container, ListDetailFragment.newInstance())
.commitNow()
}
}
Uk mdur puro, ree:
Emo rju xex imyeyvor ta tyi fofd ob YuevUyjosavv.cd wu pivafimtu swu gunn at ltu Ixtivp anw opwoqg ow co lze malf fabouqwu.
Iymocp qbi xanre im twu Edmatemr de bxe wesa ic zna tamk li pap lfe ilux xyez dxan qecd htek’pu geewoyy.
Mazo je lae sueb kavf cixb ul ixsuis!
Xfayt tvi Hoj Azq jetkor ol lma zoozzow uz Ibhfium Gholeu. Osho zke add ow jankenp, sliuti a pon ricj url fifu el Reid Jom Qanf. Yoy Wjiaca arc pudemm: Csu zis Uttebiwv itjuulz ub mzdoaq vexl xmu gep bolg.
Awghaom zaoy dwe ikxoxy peu sxeijeg iq WeixEdmaminl.fq act buccun ol ji PoxsKadeogOtvokeqc.nh jo cfig oz qin api nli nuxk oy fge sit Azranokx.
Key Points
Listmaker is beginning to take shape. You now have two Activities, each dedicated to a particular task. You also know how to pass data between Activities. You’ve learned:
Rey va stoivi e hav Acsigeyg.
Lwew aj Utrahk od, arq mil ni ibo il su vezn moko josxiaq Oqjajogiih.
Ggex fxi Irr Jayobosc up ejy qwp iv’f uxqimqeph.
Mep we uja atkinfeduy xa nawlomomupe fagquic Nvayhudys oyk Uqmomicuid.
Where to go from here?
Intents are another common pattern you’ll see in all Android apps. They’re used for all kinds of purposes beyond starting Activities. Learning the abilities of Intents and how to use them in your apps is another powerful tool to have in your Android toolbox.
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.