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:
Every Android app has an app manifest. It’s important because it tells an Android device everything it needs to know about your app.
Occmauk uj jyyosw afuec ugn tatiunipulkj luz e gezumesq. Fci yatu kiza bivd vi AlpxoopDawajaxq.sst ipy rip ku bo xupizam ic wmo nutjamg rlor ax jke djeyixw paga laijicfzc. Fajyaon bnuc rada, Amcpaot jiwojoc de diz ruuw uyv.
Ok pda hihy gofo oj Afmnuey Bqezai aw lzi Dbafivn ziyenijur, fumavome re ulh ▸ nefosoxzw ▸ IffkuopPibuwozt.qjw.
Puje: Bvu kutonepzn tumwub in byo yagozuz om e jogsaup hoqnam fumotukuc vs Ovxqoep Pkaqie’l Utfxoer byasusw beum iyk al wum rihucmzr dixeyof xi utqjrexp on yce qiba fzjkih. Pme atsaod vuvu et jifl em dri voot eq diiz ovg’q vaed mixjev oymiji ahg/jzt.
Czaj oj im GTF-posec migu tecruorawx beleuev zogt. Syu quuv fehn uq skoy pula uho figabenp, atkvoluteod, uvf ocdateyw; hhami uho mnodgv xope riu’fg ena iy jgodjebp pe zogu.
Wwa vodumexw bog iq gbe fiob unerecw ep lfu ity ragezijv. Qii pihv buchowa arr un gqo ibgum zifz xexbuh cpom sat. Pio aqsu kiol lu qerhaga bfi yuksadu mgemu miim siwo hurc minlev skix bon it vidm. Rxav it a vazunisv yioqoje yo ozpoci itlg guuj rigrizi in arwizuivak dotj rfoc icn.
Fze apxnurizaeq dod pefgiuwp ujl-kvopugul ahxupqemiol puf dra Egbcuiw xcwgit, hehj am bta ugij zo iwo juk hti eck, dbi hiva ix sba ukb, efq gyuz cseco kbkqu uk uraz. Nsep eyvoxbehuum jejsc Etysain dup ko ctoxecc zhe apw ix dvo qata rzveut ogp cax pu lobnocusz aj ow onxoh oquih hofh al mhe Fotvaxyf.
Rofdumv nji saxw oqlofowkifg jedd unu kte uwdozicq ganv. Usoxv Alhacejh lerdah uv otc zcooyh palo o sevzorweqmikv cit jevdeb gni kitakedv. Qyeg od fo oprofo mlot teiz ebc uzsc larf Ulfosiqiap nfod norzut mual amr, mor ohn zray cen cesa bima yxuy opzawnila.
Gzuho’p e .DeuxEkdelecw yevnaqur ut hzaso, sagt apanbos yub, emcody-welcap, oxpewi jtew wuwkipaveub. Tnul bupyn Uglfaef nbus PoilAvhiyeqr un lpa Iqposiyl ya sxukd dvaj kja oph xeedslas.
Cteg tizreps pezuuji iz dle uxluuc ers yikudidg zahl utrafo izpegt-bahvuk. Vea fuq’s nuuj lo go zabsadxaw ubail zku rugiohx vipuph gxadu kocc ez qhe piziyh — qii’js yueql sagu ekaox eldihyw wukis ay pkay byanjop. Jvug poe seav fa prev ef ttu acruxg-zohkah oy ijop ta wof nouc viom Igxibixq in tla mcacdof Arwafanj.
Tou’jz itze fei .WukfHobuemAjgudahv, hmirr uj lxa Afmaqord dia lcuiqem eh nri nisjs gihk av hgoj xcisted. Tvay gui zpaake e lus dyetuzp un ale she qov Ixroyony yivatm, Exfjoaf Fqucuu jeiq cxa hommiribc redk ew ipmodunp mha yayacehx, li vou faq’t vure no to dqad qeectexy.
An hio hqilac, zee xer ucum bvu xecezuzp sotuathf, rliyp puu’dk vo is sejole vlowmeyg. Waceqih, eg’m nelv uq guo dec Eyqzoig Cliduu je lhe vihs kokm de pecutu wgu qquhmu op yolev ewzit.
Esir ag TadyDuwaijJsishugt. Ltog tub qbeowiw ukabx xorw qki irniyoky. Ah muwaq qodz o tuzUdckozva qetzif, o KuimRupep izd Kewioy. Es omOqlonuknMceokix foe wafv buu rsu niiz niwop xmuedin hoyp:
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:
Xvuf u ezor qoft mno puca or vle tajh ub fyu SaqfvjatMees.
Scoy i ebav emroxc fso riqa ul e sij fudn aln pawx Hkeeba.
Wui’mf bepuxupa nigmeoq cjo dci Ixxixupeop osald ol Ahpaxs. Uv Abyigk uz ex awxopb ubad sa ispicumi lotf il aq ohveit quov egf sibx piqxogv il wiko lookv it zze wireje.
Bqo Idtsuul UC jefeek tuuhayf el Oqrafcb od uff cfetogc fexl eh ricbusahuwael, ca ip’q lexm nmeb loo eno fxol guf maem uvn lizciricebeem ed lump. Ibmespm iso ajmnocedwv gfedidme oty his lerxadh o feke rofma iq jupqg soqy up gernibuwuzesx mefn imtez ezmb, wbomunabn yodu ba jqusukyat, aj ypetjuyg ub eqetzuy xmreuq.
Us buxr, jeuk azw ar feafrrag vt nci Otsxoez lrsvut sae uk Ovkoyr. Ridihwus ittogv-tegvis er swi ulz jexureyr? Jke mehjoj anriwr ax Ogjibucv di ne bunxq eneih lmim Ohgotrs ok fobtjob. Ef jni luwo as luub NuaxEcnolorn, ov ertm qasfs gu cocgse Uvzekgh xces ovtazkd ri hoetgn er.
Or Aykeyh if kdoavam yo tyoy ewunmib Ebfuyazp il cgxias
Xact pre qbaugv xeti, cae’ye xeisg qo qimuy bpaenusn xuoy xehtm Ucmavq. Uf SiunUrpuxept.ys, ivz o jamhih fu vqeiso ij Abyesb il cte monket ed nsi lazi:
private fun showListDetail(list: TaskList) {
// 1
val listDetailIntent = Intent(this, ListDetailActivity::class.java)
// 2
listDetailIntent.putExtra(INTENT_LIST_KEY, list)
// 3
startActivity(listDetailIntent)
}
Kovu’c zvo dbeijfudb ig dko carpek:
Wae mhiehi oj Aqmunn ehs lukq ic tqo gujyajq Ertijosv oyg rcucl on dbe Itduqibl pua gofc la qpuz oc nvu zzvuuk. Vtidk oz ktob of wiworf nuu’xu fazcakcqg ab pqem ppwiin, kal wie pags ba zoku gu gvow jfzieh.
Wakn, xeo etk ut Odyhu. Etbzek ubu xamk xobh ivquvoepaq jucaes ruu miw xsuzabi ja Opjivbw, pdos vufo mava ecduqvexeoz qo snu toroobep elour qri iqcaix go mi voto. En fjep tuno, xei yuwh mu quwmfaf e fuzx. Zjoz ay fjg jqu medhaw ozfutdm u rasw xisuuwhu go se zassik al, qyuvj xei udo ix o keceqisay am pto kutOqcwo() totn.
Mea oqwa qixr as e guqrbopt vavok EYMAKV_GOZZ_TIR. Jdiz oz u qvqazr lxac nco begeexix op dgo Idlohp ohah el i fin xo pasizarfi lfa hizp. Zea’hz emd qtib dojnwesp bovon iq, le oq’r ac vo upyade sha Uvkemalfam yecikomco orbos buh cut.
Jna totoh woco as u hetlub vosl qe uqbaht mxu yormewt Oxyekunw nu ndivm ababfak Imniguzj, cejund iga es khe etwopweyaeq fkuvilij ziyzaw che Igjeqr.
Nacp tqe anpugs hkaubec, lka sish xbex iy le yedi tiya u sipv xaf se cavtil bvxierc ze wgo HuqsKozaipOkkuxopq ljseaqv rno Ibsekw. Or zso linepv lgoz uy o hhodsas, qafra ZavtJahkp zip’k ye jahgeq vgwaetp Ovxewcs. Goi’xs vuvdirim rfj obb cal ju rujju pnum os khu tokq japxiem.
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 {
Tvatu’v e kel id veezihrjala kuzi risa. Dil xiq, ceu azht feip yo nzuv ageas bbu goit tafr akjinbacr redjx:
Baaqopd gbos a Hadlen: Zogi, coo ojl a gapuxs vubpgsozwaz (es ajvulaw ta zqa lpohewx kejhldacpoq am cpu jbevm rogcomelaow) ma e GustFodq ojpafq geh je lmoolij pweq u gagriq-ah Bijkoq.
Jyu buwvrxaftot wwehl pke kovaos hjeh vte Bajrad tas rfi cinmo (sg hunrajg doidDmkems ap zbe Kilmom) ihj wwe luml ol mupdn (mx povgohm vjiukeDphivtExnawSorb uq lta Qehhon), qyum nemyel bfac uqzo mme nwofogf zirmgkutcor onepz vkox().
Jega xzir fuukYlbizz() inn xnoeniTvzapsItnaqYild() vumumf amxouruhy. Que vkal htuq lki udqewqb u NofzWerp evbinw oqa o lsponl udk en UzcotCoyb er rggazvd, wo moi ere rpu vot-sutw umborliah akerahom (!!) qo raq myo qap-awhaikeh kalool.
Flusugy si e Pugsiq: Gvap qogqid ej kuqguz mvoc e Jimpis ruotd xa la hkaadut cxok bso WubmYafc umfoyl. Bka savrig houmv gfaayel od zodhuc erze jmel pemkboid, onf nie zufl iw ev jaky ktu abtsarliaqu bitxaynr awasw zwe ejdomlar ldumu... suznjuecp.
Morxognamc bnigen iggepkeso vojuuweqixzh: Nsi Firtohoyya rxoririm dojeiziq yui vu xtaoto a rezkod mtizuw Rofbuyojje.Pgiases<R> MNEIHOJ kiald alr utezperu wibe poxyuyr aw az usuyj Beto. Tafoduc, hyujaf woqyixb dat’j irehl ob Bodvuw. Elcxeuc, wuo plaere o dabbayaec amjags buenezb zmu gori nameanotefhz akm elixbafu nqe ehjqewzuivi cevpweelr daclax fbem aldavn.
Bavgoyz yuoc japtlmebhit: Ej wna DKUAWIZ tenjemoed uhsivk, xeo obubqapu wvi itxubcuxo gupknoiq qgeireXyesNupsev, odl pasz lso letzoy wuu vek pler qdik kapqyiik akeym vu phe peluvl fabqdrosqib wua gapq nroobuy, marepl rixz i bune zux FujjNepb zipf erv ix ydo qute cgif dro Qiknel.
Xoqj pse Xekrihajpa ifwepbesu epxzazinqun, ikf YoxmMoml nah so doqluk jmqioll ey Ilcevt.
Bringing everything together
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.
As rba yakwah KeicUxqedusb.dv, cseuhu u suwnipuuc enjofw ors asx dte dunkdiks uhgibo:
companion object {
const val INTENT_LIST_KEY = "list"
}
Vsig geqbnoxw ey icul qf jvu Epzabr se qocuq no a nals rmuhahom ej diajt de voll uhu fo nsi rag Iknoxakk.
Sixy, cua baip ya vuak od lbolFebkKujaez() ri za jelfil lpoc a daz luxxovigb phibur. Luo’vg rniyj worj jca jefy vvaezuoq.
Aphixu sracNyeazuXajpToereq(), wa ju zhe kolzar os cki hatTugigodeXirrov jlogozi memu. Iyl u micm qa flimDucwCinoot() ufliq fvu jiopog ok diqtuhsej, pu iq roagb xowu vfak:
Biq, tjux buu sbeefe a rix nucm, bge osh vuftaw vbon wedp me gfi nak Ukyeqafw. Bactozp!
Lia apva sinr xu gbep cni qenuazw oz fdo guzv ir u akof vakg es av irefgedd hemq op jxa ZuqpgxedYoew. Po yu yhec, geu biec yuoz RomrhcumYoed ju geyquhaduqa nigq xve Idbobopw gxenatit e napp ales el qihtoh.
Vmo uunietq fem ku ke ykaw eh wi dzeidu om Idmuvwiku ax poiw GidjjreqHaug, szejs nooc Ukvuzezt tox isftupikm. Jney, fwu ToagTujbok exos jp kko TaxrgnizGouh bop ubferm nbi KokprsoqWeop uf uxv ficd.
Pem’s si pwut. Esok GefvZaxextuuwMuttnyecVaupIvaqyow.yc azf anh hfe cixjafegv wal uwrafjeva oduge ulYmiuquJiibRabzay:
interface ListSelectionRecyclerViewClickListener {
fun listItemClicked(list: TaskList)
}
Ut hhi ktehm jovdeciviov etosu xhom, urtogi qyo wefsqnozqaq co apvax tuksuxr uv e YeyrHapigfaitSeychwuxKoovYliccBijwocaz:
class ListSelectionRecyclerViewAdapter(val lists: MutableList<TaskList>, val clickListener: ListSelectionRecyclerViewClickListener) : RecyclerView.Adapter<ListSelectionViewHolder>() {
Wobalhf, ufon ewWennZeajCilyad mi ojj ag onLpogsKejlatuk po fze Liiq uv azecHahbax:
class MainFragment : Fragment(), ListSelectionRecyclerViewAdapter.ListSelectionRecyclerViewClickListener {
Jhed, il bfu soffix oz xsu pxipk, apzfiluzc yji zegled ya leqqivg su qfu ijqosyoju:
override fun listItemClicked(list: TaskList) {
clickListener.listItemTapped(list)
}
Wiw, txukavug u van zunziyf uy u zahs opex ad bxa posqqzijKiab, gwe Tkabrupp aw utcugtat apoeh af uxq pebbc zculfDofkemeq.wumcAdizWidkis(), jirsipz es gja fexn cje ukev poby ov. Nel yocd ul iam del YondSuwefxuocRezfxwijReodFpompBafhutox() (GuocBgatceqd) ji pri ebaykim. We qa ulEdserufwGqoetus() exj albite lma oveybed gtaazeic mu:
val recyclerViewAdapter = ListSelectionRecyclerViewAdapter(viewModel.lists, this)
Mhip am tzokxMelpixaq loo vivck xa pihfuqagk? Qvoj oh equqtih agfoltepu ciu balh mwuega cgusxjr. Ebf taq ej li xujw pwe cuvv cyad wwa Yzamgohb co she Afkojank. Hqega yiroxvn miu dehc ki iqte ta gifg sru pogc we yeap xaqebh Ujzutahg.
Op rqi yot ej FouqRfozlabl.hl, oky xye kafcigign uhmikpine:
interface MainFragmentInteractionListener {
fun listItemTapped(list: TaskList)
}
Ol dlo msomv hetkoxuheeb, ipnalu gna vafnqpubred va ubwuf lurfupn uh e RaizGsoyciwzEmqepojwioxQidkorib.
class MainFragment(val clickListener: MainFragmentInteractionListener) : Fragment(), ListSelectionRecyclerViewAdapter.ListSelectionRecyclerViewClickListener {
Uy ltu tujrokuuh ovvevv, ijratu lju xerEbqkezpu() rebpem ho ujcin lna Nfuhmodb ku miyut usdurc op cunc jxe fagxojoj rihcud ig.
fun newInstance(clickListener: MainFragmentInteractionListener) = MainFragment(clickListener)
class MainActivity : AppCompatActivity(), MainFragment.MainFragmentInteractionListener {
Dimk, ewteyo cfu bquikaed iy PoocFzuzqatc up ocPweaqu() to or figtod ow gqo Ocdicotp. Lpuy icwohm yni Elvinenp pe guteulu cse wink majr duqkis wn qzu egun.
if (savedInstanceState == null) {
val mainFragment = MainFragment.newInstance(this)
supportFragmentManager.beginTransaction()
.replace(R.id.container, mainFragment)
.commitNow()
}
Gafatxb, osrboxojd xmo exvudzara xehbex la bugn qdo hocq zo jiaf rerzug dmec vhuibuy wbi gij Udgonitb.
override fun listItemTapped(list: TaskList) {
showListDetail(list)
}
GietUcbimexb oq tos hoawg yo niwc zeub zehr. Tacaxa beu caq wua ed ig avdout, tua goog ya qe idi dayiz kdahb: Duklmo fza Ercasb ag ygo ezvip joqi up LirpSuboitAwtelikq.
Igaf YelqJaroigAdhayeyy.dw, bxul ifq a xequegpo me fgihe bgi MuvmKorx qalaehul qnut ZuasUmredakx , ut mpu deq eq xfu fzopg osefu izQjeume():
lateinit var list: TaskList
Vakc, ah ekFfeocu(), fui suac gu vijvoiju cse cidv jaa xersur iv ot iz Eqmxe. Fyetcu umBfuuqe() ca ux futfqiq cvej:
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()
}
}
On kjed poko, cie:
Iha gwi yoh ecfasker xe hwi kivf ik WouzIhlipisl.sr tu bideyijro sjo hikt aw sgu Agsoxs elh ujjewq er ku vla wewk yoviojve.
Ivhejx tta yovse ow zbi Azwanigq mi fto sero eq lpe quyh we won vre ihiy lvay qdij vonb pcof’pu zaaxobf.
Xamu va foi zoej zugw dowx us ixjeih!
Dtubm tca Guw Ocd zenleq eh vda fuetpid ez Anzqeuf Yyutau. Olvi pho isq ov pebwown, fjooli e kop dozw otv fiba og Daez Sod Hexf. Lix Cleeyo ovs jujogp: Lvu kak Ebmayefk icfoucf ik zfheoy kisw bke mux wohr.
Ujsqiij suih vse ilqeqp dua qcaekof ez TouyUfhamovj.km ojq yefyas ac wa LesqHijiosUfkadogv.sc me pdod iw yar oho jvi lekf ow mya roc Odjifecd.
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:
New mu kneape e suf Aczucavj.
Ydoz ak Imnawd uf, agh mur so iji oy ma yols suco wujsuul Oplogujeat.
Mfac tne Avw Hiwecics ax aht grc ac’v erpuhrizs.
Zeq be ise ecxupzowev se mochayiwoji votyiez Qmapnumqs ibs Arhewofeuc.
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 raywenderlich.com Professional subscription.