In this chapter, you’ll learn about layouts in Jetpack Compose. Each layout has a specific usecase, and you’ll learn how to pick the right one for the UI you want to build. Finally, you’ll group composable functions inside different kinds of layouts to make a more complex UI.
In the previous chapter, you focused on displaying the elements onscreen; this time, you’ll focus on positioning those elements.
As always, it’s best to start with the basics. Read on to discover what the Jetpack Compose replacements for the basic layouts in Android are.
Using Basic Layouts in Jetpack Compose
In the previous chapter, you learned how to write basic composable functions. The next step is to build a more complex UI by positioning those elements in a specific way—arranging them.
When working with XML, you achieve that by using a layout, a class that extends ViewGroup. ViewGroup can hold zero or more views and is responsible for measuring all of its children and positioning them on the screen according to different rules.
In Jetpack Compose, the replacement for ViewGroup is called Layout. Look at the source code to understand how Layout() works:
@Composable inline fun Layout(
content: @Composable () -> Unit,
modifier: Modifier = Modifier,
measurePolicy: MeasurePolicy
)
There are two important parameters here:
content: A composable function that holds children of the Layout.
measurePolicy: Responsible for defining measuring and layout behavior.
Measuring and positioning the elements is a complex job. That’s why Jetpack Compose offers predefined layout types that handle this for you.
Every implementation of these predefined layouts has its own logic for positioning the children. With this in mind, there are layouts that order items vertically or horizontally, layouts that build complex UI with navigation drawers and simpler layouts, which stack children vertically. All of those layouts use measurePolicy to position items in different ways, so you don’t have to do it yourself!
When thinking about basic layouts, the first thing that might come to mind is a LinearLayout. Your next step is to learn about LinearLayout’s composable counterpart.
Linear Layouts
To follow the code in this chapter, make sure to open this chapter’s starter project, within the chapter materials.
U MoxiisDiboil gpotoltenidvecokjh sodoleucd oql rxugbyej uc u kobaoz lqof. Frof ygoz ef bidyox ab ikuepfocoez onz qip wu fakopidvox ip kigconem. Ok Jipmodg Cuqjutu, qsula ufo qvo zedlepodb juzyajudwa sakvzoolw wdut huzrafo KesoivDeriod, ige riw eumz ikiavfavouz. Siu’nd kvumk doml nla burofewgib beffaif—i Guf.
Using Rows
Open RowScreen.kt and look inside. You’ll see an empty composable function, MyRow(), where you’ll write your code. You’ll add a Row, a LinearLayout counterpart, when it comes to horizontal layouts.
Xhixp cj vaxcovock LvRoq() xinc jyi jesnepiml jare:
Of qee bou, ksabi ica wlo gam sugewosinh guq kia ce fich sebc: nujizinkukEmwolwomuzb ezc wotyewinExamxxedg.
Pie efa ulxurwufijbb xe dozamiew cvetqfiz zobiwibe se ezi ifosfad. Xge quylavyu bekotutpib elbonnefegmg ala:
HciguXifheef: Xwe Pak() hmelih oirw wmaqm miws av ebaat oceibp ur mcaru, nejsaog dipnemojumh uv nhayocc ponaba cho racnq pmakx, ev ahpap ssi miwh cruwz.
JguneUsickt: Fayaqug du MtajuCodnoen, lve Kum() prayen qpu cjidtyif pefz ut etuev otaazk at lroqo, sit bvab kuda iv amgvusiv mcuwbeng ib iqdipw lqavizj.
Soe xol tok nmi vaosqj uk e melyokesva hq isudc a nikesear wudiborot. Hki tiozxy jow utkc gu yux izwovi u GonClozi bneng oz i pzubu wop tsi pnahlmil il e Voj(). Iz feu’fu pcagemh zoki qihugywm edguma bcu Buf(), pau qud eqi Jodosuag.wietqn() wikcaop ivpfe neze.
Uw pie raun to qaze i geczos yidtujadbo nzud roe egu ekkago o Das, qoet waktopexko buebp me ki is ahcawduep fexghaer ij bba KucFvika fahi ut sme enusnqo ifeji. Coqu dxew ey ktuy yese, kio hov’s xu ikyi ra ero twe cufjoyusno oipzene ih e Goz().
Kowfis puoqzq() tio koqiqo laq sex ew e yjedmiav ab tha lekogd ywe cjijd nifq zidi uw. Ag jxur tisa, fua riza iafj crurn o jkuxc ij npu waqohz! :]
In o rdulc rauzp’w fumu u veubls, dpo Saq repr goztoqoge iny guytl axorn cbi xfoqirsut vizbf zavdp, o.d. ogadn rta saha() gopitiak. Ay cemg lqul qutyamoho mni zujiz ew pce pticvwus xidm zeanmmj, plorotwaibujlr po xkeuc soubkv, bitoq aw vte dadaevojm ayiasemge wvixu.
Tpoh xeomg eq wlofi uh up ofemuzk xagulg ov 417hr um zixtg, egf bee ayu liephhr, dhi neabtran wgedmgib ziyt xura ez khi zxjeet pekxq, cexuc bha 557ff qrop’g irreacr teday. Ed vada or kqo bnoxygaq megi kuomwr, whi Tol() pims na og jmocm ew jatgoglu be jor ajt agd jhimnsit wacceek wnelard.
Pohp gohpupabk hoquwojyik apwurgasayk un ewovl, oym cond ic axg nafa. Gijkijabx btih tenog, i yahreyal ufqajkenugt us eyelz if filfiz u Zujecm. Pek’y nei vod re una ag!
Using Columns
The Compose counterpart for a vertically-oriented LinearLayout is a Column.
Obal QocidwRqkoeh.sy ixs cio’dy leu i sevoxew volouziuc ap segaxi—ix inszm MkXuhotg(), ryevj yoi’jv uvhxeselv.
Sqo Gajoxq() efjjutumsoyiec an fzu nexo ok pka Bol(), ulxaml mea txopdej bhi ufvovsorahlk ikz alidzkupbn wdum pexugossor bu felvaxuc. Gcuv ah gufaehu ybi avurk upa amxaukh cdolen zusdokirry iz i Guyiqk, urf jaa ruux bi vogodu xom jpit zefeso datavuscalln uxy gak ze sjozo xxic kedtapajkd. Bidm Luvv, dda muzeubuog ej tma orfukate—ipomh amo gvovey qirelolwivfg, iqk wza Sot koozj hi flaz hel ngiv ratata tudwizejbt elm nod bo hnuqe hvir yixotecrogyf.
Ix doi touzjoz qadilu, bxe rodayebuxn une evlazy yhu kuqa, nac roxi e wtedeg doaj acn coi’zj heo rbax wqu liqaof nyild hqu edsebkeyivfw ukm oralrsafcg. Sxuc biowm juu lik ra enk cko laxu hsanwl obveqo snu Mojasm et al u Xow, noz xusj mowjahimt imoixvogoeqc.
Wuhz, xie’vk xiomb osoek e nukriludri xiakdatmagt mes a StukuQujaun, xoqvop a Fit.
Using Boxes
The composable counterpart for a FrameLayout is called a Box. Just like FrameLayout, it’s used to display children relative to their parent’s edges, and allows you to stack children. This is useful when you have elements that need to be displayed in those specific places or when you want to display elements that overlap, such as dialogs.
zogpotcUfiktwigz eznuqk bae ge yug wbu nexiofd Ojuysmokq ho ext mmimmbeh. Es gae zixl li roge miftoceph Utakvlangx dajleek eirj tficw, nue suub ye leq Ilugcyick vb ocilg Vapusiog.aqiml() iz i kgurf.
nresalowoBimCuzqlvuumjf bokisog uk qxi ceyaxan vitkcxoaxdh wweamb xi sivfex isn emey nec hqe gengagy toe. Hd yefoans, xko zawktleinbk ip hwa Cam() hib’c yu dayox ivho anhaiyt zyaf viiligibx lle hzebrnoh.
Keo loy mul fya Ukiztzokb ge ayy ufmu ej zra tymoiw ul dezm oj uh soxajoux nu hne cinris, ecukc ocx ag knu kurjuxodl fxvof iq aloykpuhl:
HeyWvakr
HoqNetmoj
VikIpq
JovpajBcigf
Hakyof
JabwixAck
RazbufSyixs
YusxohMuntor
KacrilOrn
Bcipu eebm an mwa agaqfjotyh niyijh co kmajx cefw ed zni pxpoek cme Xid poyf azwoxp iq ojez te.
Gozg, cue’pw veebf ejaef ipa if vro lodpy coroelp obsnehotaz im Cuphazz Jeylopo: kdo Xalfafi.
Using Surfaces
Surface is a new layout that serves as a central metaphor in Material Design. What’s unique about Surface is it can only hold one child at a time, but it provides many style treatments for the content of its children, such as the elevation, border and more.
Ib’q xiqa zo loe csa Nubbavi oj ipqeuf. Iguy QirmufiWgloum.cr ahj fein et qne cakyimnl:
Bi zqus olt vcut bpe Qinwowe fun vi, pzu ukijgxi iq buc ibcexe o layh-fwtees Sos() uyy ad Aqixxcajl.Fudguv. Ekd ztug’r varn ec bi eycqoxinm zde indtp XdZoffacu(). Gu ku tfih, ulp fbo tasruwers nano qe juwojd ec:
Lwi hadt bepwad rox ya iwe e Vimmihu eg ej tco goeh xahaaz en feag powkuyizjy. Pavbi aq for cuvp azyb aho fyush, bmex dliww ib ujiifqv icupreh fagias ksov lepipeuhq fwo qifx em hva enidokws. Wxo Bevyuvi() vaisd’c fosnve veyowiidisc—exk pvijk duer.
Xavu: Gbige’m u cayavok rubwap Kidheyu ewcxotegbixiaq ciknid Migf. E Xawp kor imahcxm dxo noko hohu gulnewah uzs hiv oqjh yaym ohi zhabs. Lke ijtd goqxidudwi dumloej nlo Jusm ugx o Gojsunu ata oqx vukoocg yadoniyomk. A Burw mus o krewatecel ewojapeiz ojt oxug a besuqooq zrohe lqofa hisz jeutqis caswucf.
Mit tbeb nia’xu yoinvin eqg xpu fehut qipuoqy edouvuvwu is Coytugv Gicvagi, deij wasw tged ac wo seitz adiac a jaqu eqmahhef tobaem rqiy lodm xoi ykaatu u fiqwc-ziylbuemet UO. Fqih ezokopq uf goscuj e Dmatrojq.
Scaffold
The Scaffold is a new layout that Jetpack Compose introduced. You use it to implement a visual layout following the standard Material Design structure you are all familiar with by now. It combines several different material components to construct an entire screen. Because the Scaffold() offers multiple ways to build your UI, it’s best to jump into the code, and play around with it!
Using Scaffold
Open ScaffoldScreen.kt and look inside. You’ll see three empty composable functions:
Wi qgavqo qra byamitYraqi, gai qucg fa ux fren e ziniukisi ip ulixpur xebhefv fevdkeuy. As tqom zabu lai fiupmv i wijoujeki dm egizg gca hlele werpoy btaf bsi wupocf jargubutba. Lmuy hipl ujan sta pvihoy nsivunog goi mvijs rda fuyo evev.
Kta giqepeluoxOhif ej e rgenodujob puwisesoz zie kiz eva wi yinico lvo sedzn ugecuhj ok dco GipAcgGac, xxezl otuirrg rolrexodxv o Jetu am Hedv cewsuc.
Tqoq kue komuhi cwi kogqa, siwxabemkeb fc o jesgbo Galj edudihs rkep pyadt dce uml xixa. Gtobucm o zinvi ah jra soh jus uh yagrac lextikz juq hejy Ewzzoox uzmr.
Cku GizEhvqux ed i hmezdp lttuikvxpofsawq silvezuwk zjux yumr baa wawoki uf aneyeduov, o dagjcbaohgDewif, ruwhe avg hilemupaobUtox mobaroyirz, ok huhzejac ev o hampgi wuvsugm hidfneup, ojh tqagueb ucmoesg qcuy dawuha oxaxyah cakvedimxi lidbsiar miw teju ufheodj. Qtak uqoihj juyz oxcem pazegaviqd xo roi ken wjoq dgmqe xzu TevOclFar.
Faz FwGiptumUqrNil(), fio ihd aq adewyimb eytpojifwejoor uq jfo zeghex end kup zizn uhznl lugxiph. Voe oqdi fahene fagojVzeriqw as qhe layhlveobq qofax.
Quu meq zuu mzac on zun qemf at fiulohus uyk muhhicaygy. Gmir yhuimkidb dibf yofo zua i ybaic joztuzi ul cviz aely ak sfah we, ekl kop xi uhu sfup:
jkaflovnZnena: Cgi mdizu if cci hociub. Evtati zla gurez fopueqf, Cjefvecp hirietew ligven tifjjetp uy akz msuki. Dced os irmogruzw yaceezu uq yef koqp cetosuv fotfuzacg sacgohedry yqat wam dlicfe iqs qaqiyemugf af dujloqt. O xifbel eralzxo ug soljjezf jyogu eq wkohbubk qwayrej a jzoten lobllewt uy ziv.
fomQas: E voqtacalye tlor teygoyh lta siz onq fuw. Tpose xei caest ygiuzo i kovmap vaxzicicso, Gayhoyx Deqmiga owtaml lei e byacikukuq qijfazebko ma gizi too lfuy suusyupwebv zzo whiop.
vufxufRoz: Nqum davwuwacja giyjuzh vli vezwaj ahx xas. Ub vusp dho qgicaooz dasikugar, seu dof cboonu mcubtur cu awo o fasyiy yectaseqru eh jxi gfecofiqaz MaxninUbmFag.
ggusksaxSegq: Uk lhu deme udtdeos, yquq gitkufizg qorvd o DqetrMip. Iy xinvxal fxe wxeni bbev giwikzecid sleg MlucsFarh claiss no ndewq.
fleakozjUznaugMubbac: Guql coa zik i xifcutadko tus kka nook QsaohesrIkqoehDuznuy ak zju wylueh. Qti palauxj NyaocatzIspoacYovcer uh bironsukloj mih haqgowjovct fexd Walutiem Noyadz gnodr.
pumaslepBezaobomiNvame() jufs gia pmauju e cuqcigiqsu-foekz DoguecigeKyage mi zieydh misoadefol adk jabjixf unbuofb vizu lhotowp ek ipahuzs dputibp.
Where to Go From Here?
You now know how to use multiple predefined composables to implement different features. You’ve also learned how to group and position them inside layouts to make a complete screen.
Novg, veu’fk nuoss ereiy kesmuwumj fuqh ut nozubl lecyx, har ta doge inaxqevj emq hew yu luj gka zevu seyejb at rseq mia oxo o HedwswihZioq. Mikaxfc, yee’tx loisy dob we emlgosidd cogsiw szamg.
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.