Ċ import Ġlink . kotlin . scripts . Article Ċ import Ġlink . kotlin . scripts . Link Type .* Ċ import Ġlink . kotlin . scripts . model . Language Codes .* Ċ import Ġjava . time . LocalDate Ċ Ċ // Ġlanguage = Markdown Ċ val Ġbody Ġ= Ġ""" Ċ ![]( https :// d 2 6 2 il b 5 1 hl tx 0 . cloudfront . net / max / 8 0 0 / 1 * UN - S 8 EL MC 2 kp Hf 4 t JK fb L Q . png ) Ċ _ Dis claimer : ĠI Ġam Ġa ĠGoogle Ġemployee , Ġbut Ġthe Ġviews Ġexpressed Ġin Ġthis Ġarticle Ġare Ġnot Ġthose Ġof Ġmy Ġemploy er ._ Ċ Ċ ### ĠKotlin Ġ& ĠAndroid : ĠA ĠBr ass ĠT acks ĠExperiment , ĠPart Ġ 3 Ċ Ċ This Ġis Ġpost Ġ 3 Ġin Ġa Ġseries Ġabout Ġmy Ġexperiment Ġusing ĠKotlin Ġin Ġa Ġuniquely ĠAndroid Ġway . ĠIf Ġyou Ġhaven âĢĻ t Ġread Ġ[ part Ġ 1 Ġ( setup )]( https :// medium . com / p / kotlin - android - a - brass - t acks - experiment - part - 1 - 3 e 5 0 2 8 4 9 1 bcc ) Ġand Ġ[ part Ġ 2 ]( https :// medium . com / p / kotlin - android - a - brass - t acks - experiment - part - 2 - c 6 7 6 6 1 cf df 5 f ) Ġyet , Ġread Ġup Ġto Ġcatch Ġup ! Ċ Ċ We Ġleft Ġthings Ġlast Ġtime Ġwith Ġa Ġfairly Ġuseful Ġfunction Ġcalled ĠâĢľ v âĢĿ Ġusing Ġthe Ġtype - safe Ġbuilder Ġpattern Ġin ĠKotlin Â® . ĠIt Ġcan Ġbe Ġused Ġto Ġbuild Ġinstances Ġof Ġarbitrary Ġtypes Ġof ĠAndroid Ġviews . Ċ Ċ ``` kotlin Ċ import Ġandroid . content . Context Ċ import Ġjava . lang . reflect . Constructor Ċ Ċ inline Ġfun Ġ< re ified ĠTV Ġ: ĠView > ĊĠĠĠĠĠĠĠ Ġv ( context : ĠContext , Ġinit : ĠTV . () Ġ-> ĠUnit ) Ġ: ĠTV Ġ{ ĊĠĠĠ Ġval Ġconstr Ġ= ĠTV :: class . java . get Constructor ( Context :: class . java ) ĊĠĠĠ Ġval Ġview Ġ= Ġconstr . newInstance ( context ) ĊĠĠĠ Ġview . init () ĊĠĠĠ Ġreturn Ġview Ċ } Ċ ``` Ċ Ċ We Ġcan Ġimport Ġthis Ġdefinition Ġinto Ġsome ĠKotlin Ġcode Ġand Ġcall Ġit Ġto Ġcreate Ġand Ġinitialize Ġa Ġnew Ġview Ġof Ġany Ġtype : Ċ Ċ ``` kotlin Ċ import Ġandroid . view . ViewGroup . LayoutParams Ċ import Ġandroid . view . ViewGroup . LayoutParams . WRAP _ CONTENT Ċ import Ġandroid . widget . TextView Ċ Ċ val Ġview Ġ= Ġv < TextView >( context ) Ġ{ ĊĠĠĠ Ġlayout Params Ġ= ĠLayout Params ( WRAP _ CONTENT , ĠWR AP _ CONTENT ) ĊĠĠĠ Ġtext Ġ= Ġ" Hello " Ċ } Ċ ``` Ċ Ċ #### ĠBut Ġis Ġthis Ġpractical ? Ċ Ċ What Ġif Ġwe Ġwant Ġto Ġcreate Ġa Ġsimple Ġlayout Ġwith Ġtwo ĠText Views Ġstack ed Ġon Ġtop Ġof Ġeach Ġother ? ĠHere âĢĻ s Ġa Ġsimple Ġview Ġhierarchy Ġexpressed Ġin ĠXML : Ċ Ċ ``` xml Ċ < LinearLayout ĊĠĠĠ Ġandroid : layout _ width =" wrap _ content " ĊĠĠĠ Ġandroid : layout _ height =" wrap _ content " ĊĠĠĠ Ġandroid : orientation =" vertical " Ġ> ĊĠĠĠ Ġ< TextView ĊĠĠĠĠĠĠĠ Ġandroid : layout _ width =" wrap _ content " ĊĠĠĠĠĠĠĠ Ġandroid : layout _ height =" wrap _ content " ĊĠĠĠĠĠĠĠ Ġandroid : text =" Hello " Ġ/> ĊĠĠĠ Ġ< TextView ĊĠĠĠĠĠĠĠ Ġandroid : layout _ width =" wrap _ content " ĊĠĠĠĠĠĠĠ Ġandroid : layout _ height =" wrap _ content " ĊĠĠĠĠĠĠĠ Ġandroid : text =" World " Ġ/> Ċ </ LinearLayout > Ċ Ċ ``` Ċ Ċ Our Ġpoor Ġv Ġfunction Ġcan âĢĻ t Ġbuild Ġall Ġthat Ġat Ġonce . ĠBut Ġit Ġcould Ġwith Ġsome Ġhelp ! ĠWe Ġjust Ġneed Ġan Ġadditional Ġfunction Ġthat Ġhas Ġsmart s Ġfor Ġcreating Ġviews Ġthat Ġget Ġadded Ġto Ġa Ġparent ĠViewGroup Ġ( such Ġas ĠLinearLayout Ġhere , Ġor ĠRelative Layout ). ĠSo Ġlet âĢĻ s Ġmake Ġa Ġnew Ġv Ġfunction Ġoverload Ġto Ġbu ddy Ġup Ġwith Ġour Ġexisting Ġv Ġfunction : Ċ Ċ ``` kotlin Ċ inline Ġfun Ġ< re ified ĠTV Ġ: ĠView > Ġv ( parent : ĠViewGroup , Ġinit : ĠTV . () Ġ-> ĠUnit ) Ġ: ĠTV Ġ{ ĊĠĠĠ Ġval Ġconstr Ġ= ĠTV :: class . java . get Constructor ( Context :: class . java ) ĊĠĠĠ Ġval Ġview Ġ= Ġconstr . newInstance ( parent . context ) ĊĠĠĠ Ġparent . addView ( view ) ĊĠĠĠ Ġview . init () ĊĠĠĠ Ġreturn Ġview Ċ } Ċ ``` Ċ Ċ This Ġfunction Ġis Ġ_ almost Ġexactly _ Ġlike Ġthe Ġoriginal Ġv Ġexcept Ġfor Ġone Ġthing . ĠIts Ġfirst Ġparameter Ġis Ġof Ġtype ĠViewGroup Ġinstead Ġof ĠContext . ĠThis Ġnew Ġv Ġfunction Ġneeds Ġto Ġknow Ġabout Ġa Ġ_ parent _ ĠViewGroup Ġis Ġso Ġit Ġcan Ġadd Ġits Ġown Ġnewly Ġcreated Ġview Ġto Ġthat Ġparent Ġbefore Ġinitializing Ġand Ġreturning Ġit . ĠThat âĢĻ s Ġthe Ġfirst Ġargument Ġto Ġthis Ġfunction . ĠIt Ġwill Ġthen Ġget Ġa Ġhold Ġof Ġthe ĠContext Ġneeded Ġto Ġinitialize Ġthe Ġview Ġfrom Ġthe Ġparent Ġargument Ġinstead Ġof Ġbeing Ġpassed Ġthe ĠContext Ġdirectly . Ċ Ċ Let âĢĻ s Ġsee Ġhow Ġthis Ġnew Ġv Ġfunction Ġcan Ġwork Ġtogether Ġwith Ġour Ġold Ġv Ġto Ġbuild Ġthe Ġsame Ġview Ġhierarchy Ġas Ġthe Ġabove ĠXML : Ċ Ċ ``` kotlin Ċ import Ġandroid . content . Context Ċ import Ġandroid . widget . LinearLayout Ċ import Ġandroid . widget . LinearLayout . VERTICAL Ċ import Ġandroid . widget . LinearLayout . LayoutParams Ċ import Ġandroid . widget . LinearLayout . LayoutParams . WRAP _ CONTENT Ċ import Ġandroid . widget . TextView Ċ Ċ val Ġview Ġ= Ġv < LinearLayout >( context ) Ġ{ ĊĠĠĠ Ġlayout Params Ġ= ĠLayout Params ( WRAP _ CONTENT , ĠWR AP _ CONTENT ) ĊĠĠĠ Ġorientation Ġ= ĠV ERT ICAL ĊĊĠĠĠ Ġ// Ġadds Ġa Ġnew ĠTextView Ġas Ġthe Ġfirst Ġchild Ġto Ġthe ĠLinearLayout Ġ(" this ") ĊĠĠĠ Ġv < TextView >( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlayout Params Ġ= ĠLayout Params ( WRAP _ CONTENT , ĠWR AP _ CONTENT ) ĊĠĠĠĠĠĠĠ Ġtext Ġ= Ġ" Hello " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġadds Ġa Ġanother Ġnew ĠTextView Ġto Ġthe ĠLinearLayout ĊĠĠĠ Ġv < TextView >( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlayout Params Ġ= ĠLayout Params ( WRAP _ CONTENT , ĠWR AP _ CONTENT ) ĊĠĠĠĠĠĠĠ Ġtext Ġ= Ġ" World " ĊĠĠĠ Ġ} Ċ } Ċ ``` Ċ Ċ I Ġlove Ġthe Ġway Ġthese Ġfunctions Ġnest Ġn atur ally Ġjust Ġlike Ġthe ĠXML ! Ċ Ċ If Ġyou Ġrecall Ġfrom Ġ[ part Ġ 2 ]( https :// medium . com / p / kotlin - android - a - brass - t acks - experiment - part - 2 - c 6 7 6 6 1 cf df 5 f ) Ġof Ġthis Ġseries , Ġa ĠKotlin Ġ_ lambda Ġwith Ġreceiver _ Ġmakes Ġthe Ġreceiver Ġobject Ġavailable Ġas ĠâĢľ this âĢĿ Ġin Ġthe Ġlambda Ġbody . ĠIn Ġthe Ġspecific Ġcase Ġabove , Ġthe ĠLinearLayout Ġtyped Ġreceiver Ġin Ġthe Ġ_ outer _ Ġv Ġlambda Ġ( made Ġavailable Ġvia Ġthe ĠâĢľ this âĢĿ Ġkeyword ) Ġis Ġpassed Ġas Ġthe Ġfirst Ġparameter Ġof Ġboth Ġcalls Ġto Ġthe Ġnew Ġ_ inner _ Ġv Ġfunction . ĠBecause ĠLinearLayout Ġis Ġa Ġtype Ġof ĠViewGroup , ĠKotlin Ġknows Ġthat Ġwe Ġintend Ġto Ġuse Ġour Ġnew Ġv Ġfunction Ġoverload Ġinstead Ġof Ġour Ġoriginal Ġv Ġthat Ġtakes Ġa ĠContext . Ċ Ċ With Ġthese Ġtwo Ġbu ddy Ġv Ġfunctions Ġwe Ġcan Ġnow Ġ_ program matically _ Ġand Ġ_ succ inct ly _ Ġcreate Ġnested Ġviews Ġas Ġdee ply Ġas Ġwe Ġwant Ġwith Ġany Ġtype Ġof ĠViewGroup Ġparent Ġand ĠView Ġchild . ĠWe âĢĻ re Ġstarting Ġto Ġget Ġa Ġsort Ġuniquely Ġexpress ive Ġlanguage Ġ( some Ġmight Ġsay ĠâĢľ [ domain Ġspecific Ġlanguage ]( https :// en . wikipedia . org / wiki / Domain - specific _ language ) âĢĿ ) Ġfor Ġcreating ĠAndroid Ġviews Ġthat âĢĻ s Ġclose Ġto Ġthe Ġusual ĠXML Ġrepresentation . ĠIt Ġturns Ġout Ġthat Ġthis Ġis Ġalso Ġfaster Ġthan Ġinfl ating ĠXML , Ġas Ġwe âĢĻ ll Ġdiscover Ġin Ġa Ġfuture Ġpost Ġin Ġthis Ġseries . Ċ Ċ #### ĠRoom Ġfor ĠImpro vement Ċ Ċ There âĢĻ s Ġstill Ġsome Ġawk ward ness Ġwith Ġthis Ġscheme Ġwhen Ġyou Ġwant Ġto Ġspecify Ġa Ġdimension Ġof Ġsome Ġview Ġin Ġdensity Ġindependent Ġpixels . ĠFor Ġexample , Ġin ĠXML , Ġyou Ġmight Ġsimply Ġsay ĠâĢľ 4 8 dp âĢĿ Ġas Ġa Ġvalue Ġto Ġdescribe Ġwidth Ġor Ġheight , Ġbut Ġto Ġsay Ġthis Ġprogram matically Ġin ĠKotlin Ġusing Ġthe ĠAPI Ġprovided Ġby ĠAndroid , Ġyou âĢĻ d Ġhave Ġto Ġwrite Ġsomething Ġgn arly Ġlike Ġthis : Ċ Ċ ``` kotlin Ċ Typed Value . apply Dimension ( ĊĠĠĠ ĠTyped Value . COMPLEX _ UNIT _ DIP , ĊĠĠĠĠ 4 8 , ĊĠĠĠ Ġcontext . resources . display Metrics ) Ċ ``` Ċ Ċ Super Ġy uck ! ĠSt ay Ġt uned Ġfor Ġ[ next Ġweek âĢĻ s Ġpost ]( https :// medium . com /@ Coding D ou g / kotlin - android - a - brass - t acks - experiment - part - 4 - 4 b 7 b 5 0 1 fa 4 5 7 ) Ġwhere Ġwe âĢĻ ll Ġmake Ġuse Ġof Ġanother ĠKotlin Ġlanguage Ġfeature Ġto Ġaddress Ġthis Ġproblem Ġand Ġfurther Ġtight en Ġup Ġexpressions Ġfor Ġview Ġcreation Ġusing Ġour Ġdynamic Ġdu o Ġof Ġv Ġfunctions . ĠBe Ġsure Ġto Ġfollow Ġme Ġhere Ġon ĠMedium Ġas Ġ[@ Coding D ou g ]( https :// medium . com /@ Coding D ou g ) Ġor Ġon Ġ[ Twitter Ġas Ġthe Ġsame ]( https :// twitter . com / Coding D ou g ) Ġto Ġstay Ġon Ġtop Ġof Ġthis Ġseries ! Ċ Ċ """ Ċ Ċ Article ( ĊĠ Ġtitle Ġ= Ġ" Kotlin Ġ& ĠAndroid : ĠA ĠBr ass ĠT acks ĠExperiment , ĠPart Ġ 3 .", ĊĠ Ġurl Ġ= Ġ" https :// medium . com /@ Coding D ou g / kotlin - android - a - brass - t acks - experiment - part - 3 - 8 4 e 6 5 d 5 6 7 a 3 7 #. lg ty cz p 3 h ", ĊĠ Ġcategories Ġ= ĠlistOf ( ĊĠĠĠ Ġ" Kotlin ", ĊĠĠĠ Ġ" Android " ĊĠ Ġ), ĊĠ Ġtype Ġ= Ġarticle , ĊĠ Ġlang Ġ= ĠEN , ĊĠ Ġauthor Ġ= Ġ" D ou g ĠSte ven son ", ĊĠ Ġdate Ġ= ĠLocalDate . of ( 2 0 1 6 , Ġ 2 , Ġ 1 6 ), ĊĠ Ġbody Ġ= Ġbody Ċ ) Ċ