/* ĠCopyright Ġ 2 0 2 1 ĠN ich olas ĠHo ch st et ler Ċ Ġ* ĠYou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠApache ĠLicense Ċ Ġ* ĠVersion Ġ 2 . 0 , Ġobtain able Ġat Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ġor Ġin Ġthe Ġfile ĠLICENSE Ġin Ġthe Ġproject 's Ġroot Ġdirectory . Ġ*/ Ċ package Ġcom . cl if fr acer tech . boot y crate . activity Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . MenuItem Ċ import Ġandroid . view . View Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . core . view . isVisible Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġcom . cl if fr acer tech . boot y crate . R Ċ import Ġcom . cl if fr acer tech . boot y crate . utils . Animator Config Ċ import Ġcom . cl if fr acer tech . boot y crate . utils . apply Config Ċ import Ġcom . google . android . material . bottomnavigation . Bottom Navigation View Ċ Ċ /** Ċ Ġ* ĠAn Ġactivity Ġthat , Ġwhen Ġlinked Ġup Ġwith Ġa Ġnavigation Ġbar Ġinstance , Ġwill Ċ Ġ* Ġautomatically Ġcreate Ġand Ġmanage Ġfragment Ġinstances Ġfor Ġeach Ġnavigation Ġbar Ċ Ġ* Ġmenu Ġitem . Ċ Ġ* Ċ Ġ* ĠMulti Fragment Activity Ġwill Ġautomatically Ġadd Ġa Ġfragment Ġinstance Ġfor Ġeach Ċ Ġ* Ġmenu Ġitem Ġof Ġthe Ġnavigation Ġbar Ġmenu Ġthat Ġit Ġis Ġconnected Ġto . ĠThese Ċ Ġ* Ġautomatically Ġgenerated Ġfragments Ġare Ġcalled Ġprimary Ġfragments . ĠThese Ċ Ġ* Ġprimary Ġfragments Ġare Ġintended Ġto Ġbe Ġused Ġfor Ġfragments Ġthat Ġneed Ġto Ġbe Ċ Ġ* Ġswitched Ġbetween Ġoften , Ġand Ġfor Ġwhich Ġrepeated Ġde struction Ġand Ġre creation Ġis Ċ Ġ* Ġun des irable . ĠTo Ġfacilitate Ġthis , Ġthe Ġprimary Ġfragments Ġare Ġnever Ġreplaced , Ċ Ġ* Ġbut Ġinstead Ġwill Ġhave Ġtheir Ġviews ' Ġvis ibilities Ġset Ġto ĠView . GONE Ġwhen Ġnot Ġin Ċ Ġ* Ġuse . ĠBecause Ġthis Ġincreases Ġmemory Ġconsumption , Ġit Ġis Ġnot Ġrecommended Ġto Ġadd Ċ Ġ* Ġmore Ġthan Ġa Ġfew Ġcommonly Ġused Ġfragments . ĠIf Ġother , Ġless Ġfrequently Ġused Ċ Ġ* Ġfragments Ġneed Ġto Ġbe Ġused Ġtemporarily , Ġthis Ġcan Ġbe Ġaccomp lished Ġusing Ġthe Ċ Ġ* Ġfunction Ġadd Secondary Fragment . Ċ Ġ* Ċ Ġ* ĠIn Ġorder Ġfor Ġthe Ġprimary Ġfragment Ġauto - generation Ġto Ġsucceed , Ġthe Ġproperty Ċ Ġ* Ġnavigation View Ġmust Ġbe Ġinitialized Ġin Ġa Ġsubclass Ġbefore ĠMulti Fragment Activity 's Ċ Ġ* ĠonCreate Ġis Ġcalled , Ġthe Ġproperty Ġfragment Container Id Ġmust Ġbe Ġset Ġto Ġthe Ġid Ċ Ġ* Ġof Ġthe Ġcontainer Ġthat Ġthe Ġfragments Ġwill Ġbe Ġadded Ġto , Ġand Ġthe Ġresource Ċ Ġ* Ġpointed Ġto Ġby Ġthe Ġid ĠR . array . multi _ fragment _ activity _ fragments Ġmust Ġbe Ġa Ċ Ġ* Ġstring Ġarray Ġthat Ġcontains Ġthe Ġnames Ġof Ġthe Ġprimary Ġfragments , Ġincluding Ċ Ġ* Ġpackage Ġname . ĠThis Ġbeing Ġthe Ġcase , ĠMulti Fragment Activity Ġwill Ġattempt Ġto Ċ Ġ* Ġassociate Ġeach Ġprimary Ġfragment Ġin Ġthe Ġorder Ġthey Ġare Ġlisted Ġwith Ġa Ċ Ġ* Ġnavigation Ġbar Ġmenu Ġitem , Ġskipping Ġdisabled Ġmenu Ġitems . ĠIf Ġthe Ġnavigation Ċ Ġ* Ġmenu Ġdoes Ġnot Ġhave Ġat Ġleast Ġas Ġmany Ġenabled Ġmenu Ġitems Ġas Ġthe Ġnumber Ġof Ċ Ġ* Ġprimary Ġfragments , Ġan Ġindex OutOfBoundsException Ġwill Ġbe Ġthrown . ĠIf Ġprimary Ċ Ġ* Ġfragment Ġauto - generation Ġsucceeds , ĠMulti Fragment - ĠActivity Ġwill Ġset Ġitself Ċ Ġ* Ġas Ġthe ĠOn Navigation ItemSelected Listener Ġfor Ġthe Ġnavigation Ġbar , Ġand Ġwill Ċ Ġ* Ġautomatically Ġswitch Ġto Ġthe Ġcorresponding Ġfragment Ġwith Ġan Ġanimation . Ċ Ġ* Ċ Ġ* ĠFragment Container Ġuses Ġits Ġown Ġslide Ġleft Ġor Ġright Ġanimations Ġfor Ġits Ċ Ġ* Ġprimary Ġfragments , Ġalthough Ġthe Ġduration Ġand Ġthe Ġinterpol ators Ġused Ġfor Ċ Ġ* Ġthese Ġanimations Ġcan Ġbe Ġset Ġthrough Ġthe Ġproperty Ġprimary Fragment Transition Animator Config . Ċ Ġ* ĠThe Ġanimations Ġused Ġfor Ġthe Ġaddition Ġor Ġpop ping Ġof Ġsecondary Ġfragments Ġcan Ċ Ġ* Ġeither Ġbe Ġpassed Ġin Ġdirectly Ġto Ġa Ġcall Ġof Ġadd Secondary Fragment , Ġor Ġwill Ċ Ġ* Ġdefault Ġto Ġthe Ġvalue Ġof Ġthe Ġproperties Ġsecondary Fragment Default Enter Anim Res Id Ċ Ġ* Ġand Ġsecondary Fragment Default Exit Anim Res Id . Ċ Ġ* Ċ Ġ* ĠThe Ġproperty Ġvisible Fragment Ġwill Ġalways Ġbe Ġequal Ġto Ġthe Ġtop most Ġfragment , Ċ Ġ* Ġincluding Ġsecondary Ġfragments . ĠWhen Ġa Ġnew Ġprimary Ġor Ġsecondary Ġfragment Ċ Ġ* Ġbecomes Ġvisible Ġto Ġthe Ġuser , Ġthe Ġopen Ġfunction Ġon New Fragment Selected Ġwill Ġbe Ċ Ġ* Ġcalled . ĠOverride Ġon New Fragment Selected Ġin Ġsubclasses Ġif Ġspecial Ġbehavior Ċ Ġ* Ġwhen Ġthe Ġvisible Ġfragment Ġchanges Ġis Ġdesired . Ċ Ġ*/ Ċ abstract Ġclass ĠMulti Fragment Activity Ġ: ĠAppCompatActivity () Ġ{ ĊĠĠĠ Ġprotected Ġvar Ġfragment Container Id Ġ= Ġ 0 ĊĠĠĠ Ġprotected Ġlateinit Ġvar Ġnavigation View : ĠBottom Navigation View ĊĠĠĠ Ġprivate Ġval Ġnav Bar MenuItem Fragment Map Ġ= Ġmutable Map Of < Int , ĠFragment >() ĊĊĠĠĠ Ġval Ġvisible Fragment Ġget () Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( show ing Primary Fragment ) Ġselected Primary Fragment ĊĠĠĠĠĠĠĠ Ġelse Ġsupport FragmentManager . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfind Fragment By Tag ( get Back Stack Entry At ( back Stack Entry Count Ġ- Ġ 1 ). name ) ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġsupport FragmentManager . fragments . last () ĊĊĠĠĠ Ġval Ġshowing Primary Fragment Ġget () Ġ= Ġsupport FragmentManager . back Stack Entry Count Ġ== Ġ 0 ĊĠĠĠ Ġval Ġselected Primary Fragment Ġget () Ġ= Ġnav Bar MenuItem Fragment Map . getValue ( navigation View . selected ItemId ) ĊĊĠĠĠ Ġvar Ġprimary Fragment Transition Animator Config : ĠAn imator Config ? Ġ= Ġnull ĊĠĠĠ Ġprotected Ġvar Ġdefault Secondary Fragment Enter Anim Res Id : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprotected Ġvar Ġdefault Secondary Fragment Exit Anim Res Id : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġadd Or Restore Fragments ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġsupport FragmentManager . add On Back Stack Changed Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon New Fragment Selected ( visible Fragment !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġhidden Ġprimary Ġfragments Ġseem Ġto Ġhave Ġtheir ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġvisibility Ġreset Ġat Ġthis Ġpoint Ġfor Ġsome Ġreason . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! show ing Primary Fragment ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( fragment Ġin Ġnav Bar MenuItem Fragment Map . values ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment . view ?. isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠSee Ġthe Ġdocumentation Ġfor Ġcheck Queued MenuItem Press Ġfor Ġan ĊĠĠĠ Ġ// Ġexplanation Ġof Ġqueued MenuItem Ġand Ġmenu Item Last Press Timestamp ĊĠĠĠ Ġprivate Ġvar Ġqueued MenuItem : ĠMenuItem ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġmenu Item Last Press Timestamp Ġ= Ġ 0 L ĊĠĠĠ Ġprivate Ġvar Ġexiting Fragment View : ĠView ? Ġ= Ġnull ĊĠĠĠ Ġ/** ĠAttempt Ġto Ġswitch Ġto Ġa Ġnew Ġactive Ġfragment Ġcorresponding Ġto Ġthe Ġ@ param ĊĠĠĠĠ Ġ* Ġmenu Item , Ġand Ġ@ return Ġwhether Ġor Ġnot Ġthe Ġswitch Ġwas Ġsuccessful . Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġswitch To New Primary Fragment ( menuItem : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( menuItem . itemId Ġ== Ġnavigation View . selected ItemId Ġ|| Ġ! show ing Primary Fragment ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( exit ing Fragment View Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġqueued MenuItem Ġ= Ġmenu Item ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmenu Item Last Press Timestamp Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġnew Fragment Ġ= Ġnav Bar MenuItem Fragment Map [ menuItem . itemId ] Ġ?: Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġold Fragment MenuItem Ġ= Ġnavigation View . menu . find Item ( navigation View . selected ItemId ) ĊĠĠĠĠĠĠĠ Ġmenu Item . isChecked Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġon New Fragment Selected ( new Fragment ) ĊĊĠĠĠĠĠĠĠ Ġval Ġleft To Right Ġ= Ġold Fragment MenuItem . order Ġ< Ġmenu Item . order ĊĠĠĠĠĠĠĠ Ġval Ġold Fragment Ġ= Ġnav Bar MenuItem Fragment Map . getValue ( old Fragment MenuItem . itemId ) ĊĠĠĠĠĠĠĠ Ġold Fragment . view ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexiting Fragment View Ġ= Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Translation Ġ= Ġwidth Ġ/ Ġ 2 f Ġ* Ġif Ġ( left To Right ) Ġ- 1 f Ġelse Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanimate (). alpha ( 0 f ). translation X ( end Translation ). with Layer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Config ( primary Fragment Transition Animator Config ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with End Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġexiting Fragment View ) Ġ{ Ġvisibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexiting Fragment View Ġ= Ġnull Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Queued MenuItem Press () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. start () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġnew Fragment . view ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! isVisible ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtranslation X Ġ= Ġ Ġwidth Ġ/ Ġ 2 f Ġ* Ġif Ġ( left To Right ) Ġ 1 f Ġelse Ġ- 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalpha Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Visible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanimate (). alpha ( 1 f ). translation X ( 0 f ). with Layer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Config ( primary Fragment Transition Animator Config ). start () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠTo Ġprevent Ġvisual Ġbugs Ġdue Ġto Ġnew Ġanimations Ġstarting Ġbefore Ġthe Ġold ĊĠĠĠĠ Ġ* Ġones Ġare Ġfinished Ġwhile Ġstill Ġallowing Ġthe ĠUI Ġto Ġfeel Ġresponsive , ĊĠĠĠĠ Ġ* ĠMulti Fragment Activity Ġqueues Ġnavigation Ġmenu Ġitem Ġp resses Ġthat Ġoccur ĊĠĠĠĠ Ġ* Ġduring Ġthe Ġlast Ġhalf Ġof Ġthe Ġtransition Ġanimation , Ġand Ġplays Ġthem Ġwhen ĊĠĠĠĠ Ġ* Ġthe Ġtransition Ġanimation Ġis Ġfinished . Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcheck Queued MenuItem Press () Ġ{ ĊĠĠĠĠĠĠĠ Ġqueued MenuItem ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnow Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġanim Duration Ġ= Ġprimary Fragment Transition Animator Config ?. duration Ġ?: Ġ 3 0 0 L ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġallow able Margin Ġ= Ġanim Duration Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( menuItem Last Press Timestamp Ġ+ Ġallow able Margin ) Ġ>= Ġnow ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswitch To New Primary Fragment ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . queued MenuItem Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Secondary Fragment ( fragment : ĠFragment , Ġenter Anim Res Id : ĠInt ? Ġ= Ġnull , Ġexit Anim Res Id : ĠInt ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" NAME _ SH ADO WING ") ĊĠĠĠĠĠĠĠ Ġval Ġenter Anim Res Id Ġ= Ġenter Anim Res Id Ġ?: Ġdefault Secondary Fragment Enter Anim Res Id ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" NAME _ SH ADO WING ") ĊĠĠĠĠĠĠĠ Ġval Ġexit Anim Res Id Ġ= Ġexit Anim Res Id Ġ?: Ġdefault Secondary Fragment Exit Anim Res Id ĊĊĠĠĠĠĠĠĠ Ġval Ġtag Ġ= Ġsupport FragmentManager . back Stack Entry Count . toString () ĊĠĠĠĠĠĠĠ Ġval Ġtransaction Ġ= Ġsupport FragmentManager . beginTransaction () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Custom Animations ( enter Anim Res Id , Ġexit Anim Res Id , Ġenter Anim Res Id , Ġexit Anim Res Id ) ĊĠĠĠĠĠĠĠ Ġif Ġ( show ing Primary Fragment ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . hide ( selected Primary Fragment ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . add ( fragment Container Id , Ġfragment , Ġtag ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġtransaction . replace ( fragment Container Id , Ġfragment , Ġtag ) ĊĠĠĠĠĠĠĠ Ġtransaction . addTo Back Stack ( tag ). commit () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Save InstanceState ( out State : ĠBundle ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Save InstanceState ( out State ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( id And Fragment Ġin Ġnav Bar MenuItem Fragment Map ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsupport FragmentManager . put Fragment ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout State , Ġid And Fragment . key . toString (), Ġid And Fragment . value ) ĊĠĠĠĠĠĠĠ Ġout State . put Boolean (" was Showing Primary Fragment ", Ġshowing Primary Fragment ) ĊĠĠĠĠĠĠĠ Ġout State . put Int (" selected Nav ItemId ", Ġnavigation View . selected ItemId ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġon New Fragment Selected ( new Fragment : ĠFragment ) Ġ{ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Or Restore Fragments ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfragment Names Ġ= Ġresources . getString Array ( R . array . multi _ fragment _ activity _ fragments ) ĊĠĠĠĠĠĠĠ Ġvar Ġmenu Item Index Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġassigned Fragments Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġtry Ġ{ Ġwhile Ġ( assigned Fragments Ġ< Ġfragment Names . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġfragment Names [ assigned Fragments ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmenu Item Ġ= Ġnavigation View . menu . getItem ( menuItem Index ++) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! menuItem . isEnabled ) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfragment Ġ= Ġsupport FragmentManager . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( savedInstanceState Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Factory . instantiate ( ClassLoader . getSystem ClassLoader (), Ġname ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġget Fragment ( savedInstanceState , Ġmenu Item . itemId . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" The Ġsaved Ġinstance Ġstate Ġmust Ġcontain Ġa Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" fragment Ġfor Ġeach Ġnavigation Ġmenu Ġitem Ġid .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav Bar MenuItem Fragment Map [ menuItem . itemId ] Ġ= Ġfragment ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassigned Fragments ++ ĊĠĠĠĠĠĠĠ Ġ}} ĊĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠIndex OutOfBoundsException ) Ġ{ Ġthrow ĠIndex OutOfBoundsException ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġnavigation Ġmenu Ġof Ġthe Ġnavigation Ġbar Ġmust Ġhave Ġat Ġleast Ġas Ġmany Ġenabled Ġmenu " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" items Ġas Ġthe Ġnumber Ġof Ġfragments Ġnamed Ġin ĠR . array . multi _ fragment _ activity _ fragments .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtransaction Ġ= Ġsupport FragmentManager . beginTransaction () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. run On Commit Ġ{ Ġinit Primary Fragment Visibility ( savedInstanceState ) Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( savedInstanceState Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( id And Fragment Ġin Ġnav Bar MenuItem Fragment Map ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . add ( fragment Container Id , Ġid And Fragment . value ) ĊĠĠĠĠĠĠĠ Ġtransaction . commit () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Primary Fragment Visibility ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwas Showing Primary Fragment Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsavedInstanceState ?. getBoolean (" was Showing Primary Fragment ") Ġ?: Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġsaved Nav ItemId Ġ= ĠsavedInstanceState ?. getInt (" selected Nav ItemId ") ĊĠĠĠĠĠĠĠ Ġif Ġ( saved Nav ItemId Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnavigation View . selected ItemId Ġ= Ġsaved Nav ItemId ĊĠĠĠĠĠĠĠ Ġnav Bar MenuItem Fragment Map . forEach Ġ{ Ġmenu ItemId And Fragment Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmenu ItemId Ġ= Ġmenu ItemId And Fragment . key ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfragment Ġ= Ġmenu ItemId And Fragment . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( menu ItemId Ġ!= Ġnavigation View . selected ItemId Ġ|| Ġ! was Showing Primary Fragment ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠEven Ġthough Ġthe Ġinactive Ġfragments Ġviews ' Ġvis ibilities Ġare Ġlater ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġset Ġto ĠView . GONE , Ġsetting Ġthem Ġto ĠIN VISIBLE Ġthis Ġfirst Ġtime Ġensures ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthat Ġthe Ġtransition Ġanimation Ġplays Ġcorrectly Ġthe Ġfirst Ġtime . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment . view ?. visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġnavigation View . setOn Navigation ItemSelected Listener (:: switch To New Primary Fragment ) ĊĠĠĠĠĠĠĠ Ġon New Fragment Selected ( visible Fragment !! ) ĊĠĠĠ Ġ} Ċ }