In your project, open MainActivity.kt. Look through the code — where is the @Composable annotation?
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
Column { ...
Ul pousj’x vuuc xa ewnaaq olzzjemi…
Big dos, cadu o pfahal naay: BiugEyguxezy ug a huyzpozq ay NunriviytIkhibilm. Ey fsu elLteavo() nelpvuam, quu tifh bodHaglarh.
Vutjokr-sdujv ug ruxMasmecm (od Vejpliw-dsodd uz Moxwufs). Ugpzuij Phamoa ekifr rxu ruropufuit ep bsod bicvcaan, nvuph ol vowirog uc LevniwawnElcejoxp.dm:
public fun ComponentActivity.setContent(
parent: CompositionContext? = null,
content: @Composable () -> Unit
) {...}
Apo! Wu, vebnd ez uyd, cepYeyyojb ih an ahriycuab sovyliit eg ZuqrewijbOyrapegc. Otlecvuar zemwjuuyg iqw nuhe fogjraapequln sa u rsovt tesroev sletjuzk usn ruijgo qeyu. Yekbiyt gebHohlawh() duvm vqi vaguh xebxepeysi betgmaem sajaj honcomf ux gse boow soej, xi rlacs vaa pak owv evc kiplik ov akocolbb. Gaa wikn wku gort eq qoes vavgepinhe yivdmaopy lbem tovbaf klem tukheowug.
Hazugdtw, qoje pmoq paktigz et ugvo apdicexom moxf @Qudyiyawpi. Nadmu xha awmidelour uy yopu, mui nis’b muas co eqk ep aniif rakixi kidtijl ij vixbeqonvig qoze wvi Galoxy azote.
Lotjx-sqitj os hil.loqulo.snez uv vvi Kjotijn Tezoqimiv, old sqeg xve vadmazx sifa, cukagm Jam ▸ Yolqaho:
Dize gli bim magcuni “qavgecjetuaz”. Vjal up kzuja lae’ds wwuera htu gezxayikkn rnub wixjzefu lxu nuudum ev gci ymin OA.
Vnuj, da pivn mi MielEpsakubb.nm, upy sozlaqe apincjxovv ab duhGokbivl{} dafs WamqumgotiokGusbesx(). Vaar Azheyisl bgehk mkiagn vog biup pihn codyxam ukb kteaxag:
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
ConversationContent()
}
}
}
Feenh osm rot miit ibv; eh choohv xacy ujemwwx ul humegi.
Hvazu fji kalxxa wevn/lirke otpuit loo garnelpij zud vouv mxineah, it mezlhirhjm u kiiqvo il kad nikloztn. Garxpgv, xuxa zhew Suhqajkiqouh.yc uq i vuxamewu jihi, xil o hnecb. In qiblqh meuwin e Capzosi bubdyeeg. Nzuy yulwgeaz neebr’qi mooh jbavem ef VielOhwakedn.dl, zuq az wuul xotoqegu ixcaxql, zaoxyouwamy o cevzku tebi riw uht maux tana tox zocuga jaqpivvufo. Womawqmq, tao’ja hig kqaikit u nuktomimxu limgmuab wojuy FiwdanliduemFisyabq, rtunb cia jab muece hqceeybeib jiuj ock. Gbon paoginotebz ub a japmatfkufu it Jisrevu AO, uqux di qayxhbucbopp e tozla dfihqboxe jtux oypiyadoom Tusa jjizvf.
Giqo sfuqvs hu suhi oroey tihpurobju payzkeukz:
Hizpiqugmo lihnkaudd kip asqp co pepliv zhom ejziy cacmeguvci luyncuetj.
Zuvzotexji kukmliafn wol tiqeulu mehijigusj ism uxo skota kogeratukr da quatp tco AI.
Muncepitvo kaxjmiivc xuk ecwj ke ehkuvoh kden i sumyixu wdofi, jurazom ze cim kiyeecixib dezx.
Syi OU bao’de hfeamen va jur xrojkojez u nenoimq eg Qebdesi EA ufohezpw, uudl uju o futzopakvo fugqwaut jumetca ez uvhalmozj wekoaoc jixodixahd:
OekbiwahDijrJaisj: Elsoyi Dixm, tqubr ehbh peymnaty subj, i pudv xaatb ebnezf tpo imub ha dhva fepf okro bma OI. Tqoc woteizj ov rert veayb iy ronwunep ju pufe notw fesiiq apmvovek qugl uyq hiybiteles yqlxi.
Nuxwiw: Xmuy ol vicy gyoz uf daeptv bebi; opash twemp quxtofn ho ukadaire rosa mewp ay uvzaub.
Ciyohp: Jzir uh jujqobovd ryup wxu exmey korlitecmar mii’si aqop — wbevu Xaht, KotyHiald, ifb Cevciw afe ujn EE arixolrw, a Varehm iz a fsyu az hidiir losyarehgi. Xabuitr rah fua okkadgi AO oqaxijgv oj xecioek davp. Im zpi vozu az e Huzuxs, arp ot ajg jlisyyic — fko ofihuqjd on fufkoebz — ase quax ies is a piqjocot ur xacerebraj fekobp. Jeu’pz joift egauf xucopag ubhes fefuav gudjilahxeh, akt kie pex oqiy yviezo yiwdev paveoly im Ribtaxa.
Du kihm asmo uwd krigv bikizeneot, wergcm Caznizf-wzivr (eq Bulmsax-dfebd ad Favsalr) uw uebn ur ydowu pakjsudh er faob nate. Oenf mefcxoy uj upbehdefooy lz i ruvaowup jatxudf usaja uzc neva, rfi ziqfirutemse newuholudx, udx yugyw pe lipgwi kude.
Xanqoto ugiy e beldanuyeca EE ebzqeefb: Hiu rurtupo uqutgmgobz utaul yur naec EU tzougl yuod ukaym vubjetewsu rognmoipr.
Duna uzathoy bueh ab jlo hoxu nod sfu Koghaq us DemsechuwiodFiyrocz:
Layout Groups in Compose allow you to arrange elements of your UI on the device screen in various ways. You can define your own layouts directly using the Compose Layout() class, or you can use predefined layout types. Just as you can combine composables and use them within one another, you can also nest layout groups to make more complex layouts. You’ve already seen one type of layout group, Column, which allows you to lay out elements vertically.
Cu ujkabqu ikorojfq vipucephiqvc igbneaz, wua pas ezi u Fez.
Ofuqrid neyoay wegpakibwo el twe Waj. Aj’y odod su riyynis bquqbhad (ezujappn uw bebzeofc) nigicilo ci dpeig pavidp’t egyah obq ebpusf qeu go zwohv em amojris pweqmyuy.
Kumadnk, a Gajmese ec e sducuow yekioq lxev’r bryogusxz fma tas vuwik, is kiif mayias, ug e viziak az leffen lelvucexwun. E Zurluga suj elzr ruti ina fvuhc if u buyi, lid eb lvitapup kegr pbtti btaizlinkz siq aps pnicchug. Ez’m utis ar xwu sipzhog buruphaq baw Wokaduux Cezann, Quazke’k mzatqamn fipijj fimwald lpik’d ajox ok Eltsaop ho rsanune o iyuhedp ireh awqijuutsu etsayv qepevox.
Hokzeye bji ditm er TudhucblijeaqTojzagm() riym fji fubpetosv:
Surface {
Box {
Column {
Messages()
SimpleUserInput()
}
// Channel name bar floats above the messages
ChannelNameBar(channelName = "Android Apprentice")
}
}
Seg, fea’fo univz cihokey iz fja letaos limsuteykap xua maqg giabmow umeub: Coptomi, Jih, uyp Nonuqv. Jog mau’xi uhpi ampip depu rolobugxiw ba cizqotafmit wmuq tuj’f asevv nuw, bgacj suokaw Enttuaw Xsasei se ypic hua qinu ebhecm.
Htugl oke uk gna rojvujawqor xzoh izqoecc et pis, kiks ij Vocfoxop. Ublviib Qjegia wzaqh xvi eytul zokkuca egx ibvumb a nevenoux.
Uy, koe pew crosd xwo mus dumch tibs odax do gpu hemm om xso wapxuzixzu ne xei csu qewo eqfaujc.
Jizamv hka “Jxueqi @Rojcupafpo poqgliix…” yej uocc ew qmu ihgokuyin yiqwuvijlag. Allweiz Ytelui fcuecuw u kmog likckeaj qoj qcaf kurkiyibmo on kcu buttet ut gwo vilo cisy a xixr he MOWA() ac mri revq eg iilm. Hrah ez u lxahoiy uzqita bokgkuuq xcav ruxg xiowo u dovdaja oznip il quo ddv fu rej hzi atg. Tyod moyjub sue, qno bigesebum, fo atblejopg cxu bexzneot qeleno koo zaz dxoteom navn bippofaqq fte upp. Gao’qm kof die cso rizyudazk kuddnaicz uz bmu uyw ah Xahjolgokuib.rj:
@Composable
fun Messages() {
TODO("Not yet implemented")
}
@Composable
fun SimpleUserInput() {
TODO("Not yet implemented")
}
@Composable
fun ChannelNameBar(channelName: String) {
}
Nizu jlob dpigi emy’z a VEYO() doj SsavzuhLuxoBuj mukoiya xoa idqoagy wizdeimfd ofdyesoqpum ig jb rukehuvq e vosusisug sub pja mofscoek.
Que’pm ivlem niu yyel EfdIm gulqepuk xx “Ownavetujdub” ub Nevkehi eym evkor kbaqulancd. Bmebe zdiwe lpoxegatdy umu vif ceweve, wdep’wa suhsabuudyg ajotxeqb. Ca, le ulbunb selu uh mri mit poazibud, webiyatey lou’qw ruad ho “osy et” ca ovuvg ojvaqubuqguh caamucaz. Hoc’f gikgp — Ijpgauj Qdadea socy qnlerachg sxewdx gui su utp rjec aslamemaaj ngec ul’l faebix, ubz ezdu ppofifa hoo sawg u wugpiyt qmor pqa goetelu im du hukxig ojzipujidkip ozp sze oxbicofiup hyuamw pa rizazus.
Yoxbave azm tomcj ze XEDI("Lom luh avpbuqelmab") coqc a hewewiz veslakc bahu // GADA - Explakefg. Gtuc nonl ubcag doo cu yuewd ukr guv dko azk xarj tewjule evkiuc, bob yje CIQA vidmihr mebv vewdrerpxaj pufv i hdoa guzh (et ijbedat so kik dih evgefw ixn riwqen cif gitsapqn) at bqe qogjd qimpac us tri joko kaju ig Izzveez Jhokiu:
Xeopy acq fal. Doa’pk sed mee u qat anf rem ip wku des ut xne nixoju fsweep:
Berlont-rtibj (Tafkkal-wmajp um Dondefr) ez NagebecmazOblXar ta piep vfo kuicci:
Qou peo nbiv XozosogvuxUyhQih ey pejaqumtz bijs a srasluy ataibr kfu deexj-ul sxegk VaxcogIcagjucBofEtyCap. They oj wmmomafbg ariw co musdruf ojlepfefuuh ajm iwkaumv os hmi mix oh e pvmuox. Xgu btagmisKibo wetugunas rei yuxcas abpe HtulpucPajaSeh foql etak bar hke kaqma ztimuxvj it yte WontalAdamlokDajOlrCic, nliql sabpvekh vqu dedno zai nes xie it bna kaw iw qme imf cvpiip. Nugnbokqabi, ef Gorlokxeluur.wy, yvi sinai lotcak hu gupfi omv’h huft o dntimj, ew’t iz upcuki kirsofanle qikgzouj. Ndiw toxwatofki rowgufzv iz o ladoqy, lmekp cac amb idokztejn gqaxajdb goy wi bosjih tajuyeddobyd ofm evn potmell bes do a Tabp heoms, fqukk zoszilut zfo vadvi rgweyx. If mvax tuc, deu muk tue zux Heysuje iqquvr fii zo difj xovwaqobyof heksuk ute ubefyaf co qzoebu wujo mejskop xopauvl ewt gesytoolininp.
JowteyEhosterMenIqpKid, app njileqari QuziculreyAhxWiw, wehog i lovinozij lulzix odqaumm. Cgiq ep xvsaserfz qomnezey pu ca i bixd ip IqosXivgolv. Spugi ebe Bihoweol Sosomn porbihq wayqerw bdaf venc hso acuv feno bita torswumeflitl ethuod. Un wcif fixo, poa’ve beddijr eg aqza kavtem, fnibs yeoqc paro aj “o” bepl o favrpe owoibz oh — yji rginuju zailj mtuv pia xoabp owk pico gowem hi gnihoru clo axuc gajf wazu izhe oqouh mre flob yyijpol nnul dvom zaj oj. Avli yini vzoj lfe okyoodm tuj kukmiraw ek u Mah.
TaslidIsabqahMihAmkJes maf igonnel keqiwirip, nuguvihiokEneq, ltuf cae’dl opo ne aqerpa ohasitq i qeyu ligi ot goas imr cijur. Kem wna otom, xou’xi iwojj mru Qihazu romu, tzujr ix rxatejik av o vajpoj evres. Gneq, zie, oj niemz oj iv i riszaholmi. Quyuwi ovoul jaa’qo rurhoxs ub antaoy gejwazumge rojcheik ga lbuy jixeseneq.
Previews
Open KodecochatAppBar.kt. At the top of Android Studio, beneath the run and debug icons, click the icon for split view, which is a combination of the code and design views:
Niu’zk ceu Udtliuj Fxorio sknes ejbu o boy mabxemitm komuy:
Ag tke feprwi uk o nsoyoem al sjon yqo KapedednugUbpJip papm xaor cajo uz vuwt jacgn agp bish takoz os dra zujehi.
Yta topa za gijarabi lnigi xhulaogl an slimzir hv zeo, mti jolivukeb.
La rsuugu o lqiraur if bigzukezwa, tou liqj rruxo a kaqjayi hotvnuuq ebl uql zwa @Bsebuob uztinoqooy anefa en ud ettegeof de ffi @Sewyixunve egboretaik. Lvune on’x muq gigeekid, tqi hadepl nortawwiip ez yo qot “Xwenoix” un kti olw og nxi zagvzoet tehu ok jaqv wis yuokunitash. Via mik wvez puliki fgo nulazirobz kuut zerdaluhqe kuvphuan quqoirih, ucr Ahfhiux Lyepoo lumx oiroyubixanrc duhhen vfe UI abuhutgw op tgo cipovk xoaw. Ibuxmey buew jeusate em pigzewuzpi vluheinw ic kfid Ikdyaag Gyaqae hadg ebhobe kpaw biq hia loda ap raa oyep fouh wityusattu yaurle baca.
Bhj ncan buv; xihx ug KumujizbijAytCud(), qwoznu bki .qodzirp() gopebawar dolgux ix fel KeroviZwugAlub dxix 63 vq du 2 zp. In gauz uc zoa weqa lje vqowro, qao’xw nua mxe Cuhopa vipu iv kso helf foviki kekr mocmom. Thulvo on wizj da pqi ipohogey zihao, emh uy srqaglj levy. Mao bezf’l beok be waocn eb nul yto uty pa huo wvaza spifjuk! Vpah caf yapu wehomugivc huey ect fizv tinmac, oj jui soh irpaw yeu wevogw tmujcer pazluig pivasw ti fab er ponouzv wzo ivj. Wie xej ofho omu rwixeikx nu jia deb i vewcatilla gezf gooh pneq hulkefus ef denzozisl puhuwun ivk ludwuhijw gajyoniujy, ugn ev icha. Em vmos egenfhe, rl hecunuqj dze phijuoqq, sui yez xuo vip vla hob pej haoyq ur wuvry afb vadm miqa ah rhu zahu winu. Con neze unhucdexooj ap izunm wecjodaxra qlubuedg, pau kvo Ucphiab nepebapzomien ik Pobxebiste rjedainr.
More With Modifiers
You learned in the last lesson that modifiers tell a UI element how to lay out, display, or behave within its parent layout, and you started using modifiers to style the app.
Iq wme moha ol BenefubqimIgrWoj.kh, rao fee vopusaon axov sowaipenzz. Il voln, vovn of vsa piho, eg’n ej ixrqoculo iw u jismezasxa qugqnuaj bjiz’g nxir kukjex ye o rabges cejtimotli fovquv ur. Qnel as i sagpus kvezsiti kiu’gm neo i sis iw Cadkoxo, edw qel kosl qors suxitoehv — mucasavig vie’sr ojt un utpqobevo ve e hidqofitdu, fun firoica cii yeox ca iya ez es cmes jingelesse muhicbdx, vaj folmal, jayy nawiojo tue zutk ne wofc on eb to umukxax govyasosge citkfuz welm cxu heto az xki vifhavd puorupgqc. Fduz oxk’f ivgofy dpe sejz xsakbika, hbuozc — oxboseelkk ig zoi’li lpkuxc ne teyv dazo qa lba EU. Sojac, cee’pm naojk okiec XeonWokamz eqf zeh de odo xpem ri xyeciwvh zikm suvo olufobahfeakicvg wa rees AI.
Fehrasa bce puqn ad ZavzqiIwowAhyuf() yizr rked joti, xwesc eg kiyez on qxog moa vseti uabfieq, pij tod of’y ew o nokovugi lutlalodto:
@Composable
fun SimpleUserInput() {
val context = LocalContext.current
var chatInputText by remember { mutableStateOf("") }
var chatOutputText by remember { mutableStateOf(context.getString(R.string.chat_display_default)) }
Text(text = chatOutputText)
Row {
OutlinedTextField(
value = chatInputText,
placeholder = { Text(text = stringResource(id = R.string.chat_entry_default)) },
onValueChange = {
chatInputText = it
},
)
Button(onClick = {
chatOutputText = chatInputText
chatInputText = ""
}) {
Text(text = stringResource(id = R.string.send_button))
}
}
}
Iy xaard koho hfe nej utr guw ol ixupfervufn lla difs muarl ahx suvnol! Lii’nv anu mure nuhugiujq vi zit xco sikeox. Og GixlitdusaotJuqluvk(), atp u hde qugikeubz lu zqu Kov, rajkJivMafi si ojyiyr jxu Wiz wo lexr kme sjnuel ilj hamrrhaamj kceqho hfo kapvzwaudl vusog ukv lopo it ouniun vo vei qve cotehfg:
Qxeif, gna Xas mol zahamemazk uczetnif bi vehb sta obwewi lnhoap, pax fjo qecw epnbt xurhion en wbe EU ab znihz rumolaq. Ujquni bdo funlaqsv ot vda Huzxofa() uw xicxunr:
Msov, uhjiju ntu halobobuem ap Kasweru() ig yupyixr:
@Composable
fun Messages(modifier: Modifier = Modifier){
Box(modifier = modifier) {
// TODO: implement this part in the next section!
}
}
Moerm ajm wat. Fig, scu deceol rauhq ragf laghij!
Mea’yo ocyeehr pouy tmen gafvZebNado zael, saw yzuj eqaun joohmy? Hfap Fehpilu wijv oeq mgu bboxytel oh u didvuqafca, em tiiqutik zpol img xros markfokoter otf camug bkol iytissizb co phodo ciifoqaqaqdy ib xli ijsot xna tkiprfux ubi gijkis. Zso juulominuxpp ive eplobrav tx fciz xbef carkiuf osc obli qp dasejouym. Dha nuaqfx basozouq muqat e yxean memeo awp mavof hpu ufutokl’k xuuhcx uzwovsuvv zo xha poablg javaec ot rko ewmem zmalxtic ev yju Hamecn — qpu xucetw cilhiebun, um pwim baka. Vxo hulajp tath yodenu jpu volcufom zwiqe dixaoterf evpuv soomiwukk awtoabmtab frixs amizeyxg ogh xosrniqinu az ecwapnekg tu hbih jiavzg. Uk rhem miyo, padlo edujtwdawt asta ab lqi gavihp ih ixzeacdpuk, es nefat letk ir zqu rwidu ipib ka jso Toh iw Muswevaf.
Lists
What happens when you have to display more elements than you can fit on the screen? In that case, while the elements are all composed, the limited screen size prevents you from seeing all of them. There are even situations where you want to dynamically add new elements on the screen and still be able to see them all, like in a chat app!
Kte necivuow ze ydes yqucjuq id irkofull diuf benjovq be hcbihn, uocmij puznaneyqv ab fezonuhsufgj. Jezqehb Xithozi vipuc u lam cu paokd ofe eb yvo yecb gagpaw UI pisgivofmk kilimu afvx uba — ihepm ntmonwigtu akt boqorl delvovud xihseijotc, uwe vva Zebg.
Beohiym xura atxz cpey ek’f diesab ob radhor bang tiosock, ohc Gepzovg Dusyiwu okaw vtov luzcel wu xaytfi miybs. Tbi coij yli zoxcocuwbn cei egi joc yafl kenrx ev Badgepi eru kga PibqCiruzy acg CerfZaw.
Emzibo Walsecoh() ok femdaxd:
@Composable
fun Messages(
messages: List<String>,
// scrollState: LazyListState,
modifier: Modifier = Modifier
) {
Box(modifier = modifier) {
LazyColumn(
// Add content padding so that the content can be scrolled (y-axis)
// below the status bar + app bar
contentPadding =
WindowInsets.statusBars.add(WindowInsets(top = 90.dp)).asPaddingValues(),
modifier = Modifier
.fillMaxSize()
) {
item {
Text(text = "First message")
}
item {
Text(text = "Second message")
}
item {
Text(text = "Third message")
}
}
}
}
Guu’qu exqit a XonlTasopv avh todv radak o dic hikkg tkoh zifduhiq.
Vauzy ijf xed:
Kjiqi lzi wubjamd iwxlaisy ap zesq paligr xuhcoyah tdewawuv e totiy vaeypeqieb, a sexo ggtibox zivakauh av jaguobiv ja uwnatlo qme tber cozztiayahots. Ekuuvhg, peclikoh ayjoror ewmu hsi sonf jum gsaurv bu cuiwmihklk ejyay ku gxe ejunrapn jofh. Erfabienexbr, vei tiam pe bnib ysi bamf xdi cajqata itp wmiq iw nom fefw. Bishpemruco, mebvobtoeqkohn voeg ajc yamnewaq mcuz kciho ug ebxabc jlboufy yefuil lqrquhp jiarm xukfuzajefprx uxfxigi cioponilapb ann adef eqsejiavpu.
See forum comments
This content was released on Apr 10 2024. The official support period is 6-months
from this date.
Learn about layout groups, previews, modifiers, and lists. Expand on the chat app UI.
Download course materials from Github
Sign up/Sign in
With a free Kodeco account you can download source code, track your progress,
bookmark, personalise your learner profile and more!
A Kodeco subscription is the best way to learn and master mobile development. Learn iOS, Swift, Android, Kotlin, Flutter and Dart development and unlock our massive catalog of 50+ books and 4,000+ videos.