/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttps :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . example . compose . j etch at Ċ Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . compose . runtime . Composable Ċ import Ġandroidx . compose . runtime . Disposable Effect Ċ import Ġandroidx . compose . runtime . mutable State ListOf Ċ import Ġandroidx . compose . runtime . remember Ċ import Ġandroidx . compose . runtime . snapshots . Snapshot State List Ċ import Ġandroidx . compose . ui . Modifier Ċ import Ġandroidx . compose . ui . platform . Local Context Ċ import Ġandroidx . compose . ui . view interop . Android View Binding Ċ import Ġandroidx . core . view . forEach Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . Fragment Activity Ċ import Ġandroidx . fragment . app . Fragment Container View Ċ import Ġandroidx . fragment . app . commit Ċ import Ġandroidx . fragment . app . find Fragment Ċ import Ġandroidx . view binding . View Binding Ċ Ċ /** Ċ Ġ* ĠTODO : ĠF rag ments Ġinfl ated Ġvia ĠAndroid View Binding Ġdon 't Ġwork Ġas Ġexpected Ċ Ġ* Ġhttps :// issue tracker . google . com / 1 7 9 9 1 5 9 4 6 Ċ Ġ*/ Ċ @ Composable Ċ fun Ġ< T Ġ: ĠView Binding > ĠFragment Aware Android View Binding ( ĊĠĠĠ Ġbinding Block : Ġ( LayoutInflater , ĠViewGroup , ĠBoolean ) Ġ-> ĠT , ĊĠĠĠ Ġmodifier : ĠModifier Ġ= ĠModifier , ĊĠĠĠ Ġupdate : ĠT . () Ġ-> ĠUnit Ġ= Ġ{} Ċ ) Ġ{ ĊĠĠĠ Ġval Ġfragment Container Views Ġ= Ġremember Ġ{ Ġmutable State ListOf < Fragment Container View >() Ġ} ĊĠĠĠ ĠAndroid View Binding ( binding Block , Ġmodifier Ġ= Ġmodifier ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfragment Container Views . clear () ĊĠĠĠĠĠĠĠ Ġval Ġroot Group Ġ= Ġroot Ġas ? ĠViewGroup ĊĠĠĠĠĠĠĠ Ġif Ġ( root Group Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfind Fragment Container Views ( root Group , Ġfragment Container Views ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġupdate () ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġactivity Ġ= ĠLocal Context . current Ġas ĠFragment Activity ĊĠĠĠ Ġfragment Container Views . forEach Ġ{ Ġcontainer Ġ-> ĊĠĠĠĠĠĠĠ ĠDis posable Effect ( container ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFind Ġthe Ġright ĠFragment Manager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfragment Manager Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparent Fragment Ġ= Ġcontainer . find Fragment < Fragment >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Fragment . child FragmentManager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . support FragmentManager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNow Ġfind Ġthe Ġfragment Ġinfl ated Ġvia Ġthe ĠFragment Container View ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexisting Fragment Ġ= Ġfragment Manager . find Fragment ById ( R . id . nav _ host _ fragment ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( existing Fragment Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfragment View Ġ= Ġexisting Fragment . require View () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRemove Ġthe ĠFragment Ġfrom Ġwhatever Ġold Ġparent Ġit Ġhad ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ( this Ġis Ġmost Ġlikely Ġan Ġold Ġbinding Ġif Ġit Ġis Ġnon - null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( fragment View . parent Ġas ? ĠViewGroup )?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove View ( fragment View ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRe - add Ġit Ġto Ġthe Ġlayout Ġif Ġit Ġwas Ġmoved Ġto ĠRES U MED Ġbefore ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthis ĠComp osable Ġran ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer . addView ( existing Fragment . require View ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Dispose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( existing Fragment Ġ!= Ġnull Ġ&& Ġ! fragment Manager . is State Saved ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġstate Ġisn 't Ġsaved , Ġthat Ġmeans Ġthat Ġsome Ġstate Ġchange ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhas Ġremoved Ġthis ĠComp osable Ġfrom Ġthe Ġhierarchy ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Manager . commit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove ( existing Fragment ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġfind Fragment Container Views ( ĊĠĠĠ Ġview Group : ĠViewGroup , ĊĠĠĠ Ġlist : ĠSnapshot State List < Fragment Container View > Ċ ) Ġ{ ĊĠĠĠ Ġview Group . forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( it Ġis ĠFragment Container View ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist Ġ+= Ġit ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( it Ġis ĠViewGroup ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfind Fragment Container Views ( it , Ġlist ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ