package Ġcom . san og uer al oren zo . views . binding Ċ Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Looper Ċ import Ġandroid . view . View Ċ import Ġandroidx . core . view . do On Detach Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . lifecycle . Default Lifecycle Observer Ċ import Ġandroidx . lifecycle . Lifecycle Ċ import Ġandroidx . lifecycle . Lifecycle Owner Ċ import Ġandroidx . view binding . View Binding Ċ import Ġkotlin . properties . ReadOnly Property Ċ import Ġkotlin . reflect . K Property Ċ Ċ class ĠFragment View Binding Delegate < T Ġ: ĠView Binding >( ĊĠĠĠ Ġbinding Class : ĠClass < T >, ĊĠĠĠ Ġval Ġfragment : ĠFragment , Ċ ) Ġ: ĠReadOnly Property < Fragment , ĠT > Ġ{ ĊĠĠĠ Ġprivate Ġval Ġclear Binding Handler Ġby Ġlazy ( Lazy Thread Safety Mode . NONE ) Ġ{ ĠHandler ( Looper . get Main Looper ()) Ġ} ĊĠĠĠ Ġprivate Ġvar Ġbinding : ĠT ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġbind Method Ġ= Ġbinding Class . getMethod (" bind ", ĠView :: class . java ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġfragment . view Lifecycle Owner LiveData . observe ( fragment ) Ġ{ Ġview Lifecycle Owner Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Lifecycle Owner . lifecycle . add Observer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠDefault Lifecycle Observer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Destroy ( owner : ĠLifecycle Owner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbinding To Cleanup Ġ= Ġbinding Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġensures Ġbinding Ġis Ġonly Ġcleared Ġafter Ġdet ached ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclear Binding Handler . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding To Cleanup . root . do On Detach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( binding Ġ=== Ġbinding To Cleanup ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetValue ( this Ref : ĠFragment , Ġproperty : ĠK Property < *> ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠonCreate View Ġmay Ġbe Ġcalled Ġbetween Ġon Destroy View Ġand Ġnext ĠMain Ġthread Ġcycle . ĊĠĠĠĠĠĠĠ Ġ// ĠIn Ġthis Ġcase Ġ[ binding ] Ġrefers Ġto Ġthe Ġprevious Ġfragment Ġview . ĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġthat Ġbinding 's Ġroot Ġview Ġmatches Ġcurrent Ġfragment Ġview ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ref . view Ġ!= Ġnull Ġ&& Ġbinding ?. root Ġ!== Ġthis Ref . view ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbinding ?. let Ġ{ Ġreturn Ġit Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġlifecycle Ġ= Ġfragment . view Lifecycle Owner . lifecycle ĊĠĠĠĠĠĠĠ Ġif Ġ(! lifecycle . currentState . is At Least ( Lifecycle . State . INITIAL IZED )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Cannot Ġaccess Ġview Ġbindings . ĠView Ġlifecycle Ġis Ġ${ lifecycle . currentState } !") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbinding Ġ= Ġbind Method . invoke ( null , Ġthis Ref . require View ()) !!. cast < T >() ĊĠĠĠĠĠĠĠ Ġreturn Ġbinding !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġprivate Ġfun Ġ< T > ĠAny . cast (): ĠT Ġ= Ġthis Ġas ĠT Ċ } Ċ Ċ /** Ċ Ġ* ĠCreate Ġbindings Ġfor Ġa Ġfragment . Ċ Ġ* Ċ Ġ* ĠTo Ġuse , Ġjust Ġcall Ġinside Ġyour Ġfragment : Ċ Ġ* Ġprivate Ġval Ġbinding : ĠExample Fragment Binding Ġby Ġview Binding () Ċ Ġ* Ċ Ġ* ĠBinding Ġname Ġis Ġgenerated Ġfrom Ġthe Ġlayout Ġfile , Ġexample _ fragment . xml Ġ-> ĠExample Fragment Binding Ċ Ġ* Ċ Ġ* ĠF rag ments Ġstill Ġneed Ġto Ġhave Ġthe Ġlayout Ġpassed Ġthrough Ġthe Ġconstructor Ġfor Ġinfl ation Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠT Ġ: ĠView Binding > ĠFragment . view Binding () Ġ= ĊĠĠĠ ĠFragment View Binding Delegate ( T :: class . java , Ġthis ) Ċ