package Ġcom . lol lip op . icon core . ui . fragment Ċ Ċ import Ġandroidx . annotation .* Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . FragmentManager Ċ Ċ /** Ċ Ġ* Ġ@ author Ġlo l lip op Ċ Ġ* Ġ@ date Ġ 4 / 1 / 2 1 Ġ 2 3 : 0 0 Ċ Ġ* ĠFragment åĪĩæį¢ çļĦ è¾ ħ åĬ© å·¥åħ· Ċ Ġ* Ġ åĮħåĲ« äºĨä¸Ģ å®ļçļĦ éĢļ çĶ¨ éĢ»è¾ĳ Ċ Ġ*/ Ċ class ĠFragment Switch er ( ĊĠĠĠ Ġprivate Ġval Ġcontainer Id : ĠInt , ĊĠĠĠ Ġprivate Ġval Ġfragment Manager : ĠFragment Manager , ĊĠĠĠ Ġprivate Ġval Ġfragment Creator : ĠFragment Creator , ĊĠĠĠ Ġprivate Ġval Ġfragment Info Array : ĠArray < Tab Fragment Info > Ċ ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠNO _ FRAGMENT Ġ= Ġ- 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ é¡µéĿ¢ çļĦ æķ°éĩı ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġpage Count Ġ= Ġfragment Creator . fragment Count ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġposition çļĦ åĲĪ çĲĨ èĮĥåĽ´ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġposition Range Ġ= Ġ 0 Ġuntil Ġpage Count ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ äºĭåĬ¡ è¿ĶåĽŀ æłĪ çļĦ å¼Ģ åħ³ ĊĠĠĠĠ Ġ* Ġå¦Ĥæŀľ æ¿Ģ æ´» äºĨ è¿ĶåĽŀ æłĪ ï¼Į éĤ£ä¹Ī åı¯ä»¥éĢļè¿ĩ back æĸ¹æ³ķ è¿ĶåĽŀ åĪ° æĮĩå®ļçļĦ äºĭåĬ¡ çĬ¶æĢģ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġback Stack Enable Ġ= Ġfalse ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġä¸Ĭ ä¸Ģä¸ª Fragment çļĦ åºı åı· ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġlast Fragment Ġ= ĠNO _ FRAGMENT ĊĊĠĠĠ Ġprivate Ġvar Ġdefault Enter Animation Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġdefault Exit Animation Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġdefault Pop Enter Animation Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġdefault Pop Exit Animation Ġ= Ġ 0 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġè®¾ç½® é»ĺè®¤ çļĦ Fragment åĪĩæį¢ åĬ¨çĶ» ĊĠĠĠĠ Ġ* Ġ@ param Ġenter ĠFragment è¿Ľåħ¥ çļĦ åĬ¨çĶ» ĊĠĠĠĠ Ġ* Ġ@ param Ġexit ĠFragment ç¦» å¼Ģ çļĦ åĬ¨çĶ» ĊĠĠĠĠ Ġ* Ġ@ param Ġpop Enter ĠFragment åĽłä¸º å¼¹ åĩº æłĪ èĢĮ è¿Ľåħ¥ çļĦ åĬ¨çĶ» ĊĠĠĠĠ Ġ* Ġ@ param Ġpop Exit ĠFragment åĽłä¸º å¼¹ åĩº æłĪ èĢĮ ç¦» å¼Ģ çļĦ åĬ¨çĶ» ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠsetDefault Animations ( ĊĠĠĠĠĠĠĠ Ġ@ Animator Res Ġ@ Anim Res Ġenter : ĠInt Ġ= Ġdefault Enter Animation , ĊĠĠĠĠĠĠĠ Ġ@ Animator Res Ġ@ Anim Res Ġexit : ĠInt Ġ= Ġdefault Exit Animation , ĊĠĠĠĠĠĠĠ Ġ@ Animator Res Ġ@ Anim Res Ġpop Enter : ĠInt Ġ= Ġdefault Pop Enter Animation , ĊĠĠĠĠĠĠĠ Ġ@ Animator Res Ġ@ Anim Res Ġpop Exit : ĠInt Ġ= Ġdefault Pop Exit Animation ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdefault Enter Animation Ġ= Ġenter ĊĠĠĠĠĠĠĠ Ġdefault Exit Animation Ġ= Ġexit ĊĠĠĠĠĠĠĠ Ġdefault Pop Enter Animation Ġ= Ġpop Enter ĊĠĠĠĠĠĠĠ Ġdefault Pop Exit Animation Ġ= Ġpop Exit ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġèİ·åıĸ åºı åı· å¯¹åºĶçļĦ tab çļĦ icon çļĦ èµĦæºĲ id ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Drawable Res ĊĠĠĠ Ġfun Ġget Tab Icon ( position : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( position Ġin Ġposition Range ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfragment Info Array [ position ]. tab Icon ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġèİ·åıĸ åºı åı· å¯¹åºĶçļĦ tab çļĦ color çļĦ èµĦæºĲ id ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Color Res ĊĠĠĠ Ġfun Ġget Tab Color ( position : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( position Ġin Ġposition Range ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfragment Info Array [ position ]. tab Color ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġèİ·åıĸ åºı åı· å¯¹åºĶçļĦ tab çļĦ title çļĦ èµĦæºĲ id ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ String Res ĊĠĠĠ Ġfun Ġget Tab Title ( position : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( position Ġin Ġposition Range ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfragment Info Array [ position ]. tab Title ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ åĪĩæį¢ ä¸º æĮĩå®ļ åºı åı· æīĢ ä»£è¡¨ çļĦ Fragment ĊĠĠĠĠ Ġ* Ġ@ param Ġposition ĠéľĢè¦ģ çļĦ Fragment æīĢ å¯¹åºĶçļĦ åºı åı· ĊĠĠĠĠ Ġ* Ġ@ param Ġhide Last Ġ æĺ¾ç¤º æĸ°çļĦ Fragment æĹ¶ ï¼Į æĺ¯åĲ¦ éľĢè¦ģ éļĲèĹı ä¸Ĭ ä¸Ģä¸ª Fragment ĊĠĠĠĠ Ġ* Ġå¦Ĥæŀľ éľĢè¦ģ æĺ¾ç¤º çļĦ Fragment åľ¨ ä¸Ĭ ä¸Ģä¸ª Fragment çļĦ ä¸ĭ æĸ¹ ï¼Į ĊĠĠĠĠ Ġ* Ġåľ¨ ä¸į éļĲèĹı ä¸Ĭ ä¸Ģä¸ª Fragment çļĦ æĥħåĨµä¸ĭ ï¼Į éĤ£ä¹Ī å°Ĩ ä¼ļ å¯¼èĩ´ æĸ°çļĦ Fragment ä¸įåı¯ è§ģ ĊĠĠĠĠ Ġ* Ġ@ param Ġenter ĠFragment è¿Ľåħ¥ çļĦ åĬ¨çĶ» ĊĠĠĠĠ Ġ* Ġ@ param Ġexit ĠFragment ç¦» å¼Ģ çļĦ åĬ¨çĶ» ĊĠĠĠĠ Ġ* Ġ@ param Ġpop Enter ĠFragment åĽłä¸º å¼¹ åĩº æłĪ èĢĮ è¿Ľåħ¥ çļĦ åĬ¨çĶ» ĊĠĠĠĠ Ġ* Ġ@ param Ġpop Exit ĠFragment åĽłä¸º å¼¹ åĩº æłĪ èĢĮ ç¦» å¼Ģ çļĦ åĬ¨çĶ» ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġswitch To ( ĊĠĠĠĠĠĠĠ Ġposition : ĠInt , ĊĠĠĠĠĠĠĠ Ġhide Last : ĠBoolean Ġ= Ġ! back Stack Enable , ĊĠĠĠĠĠĠĠ Ġ@ Animator Res Ġ@ Anim Res Ġenter : ĠInt Ġ= Ġdefault Enter Animation , ĊĠĠĠĠĠĠĠ Ġ@ Animator Res Ġ@ Anim Res Ġexit : ĠInt Ġ= Ġdefault Exit Animation , ĊĠĠĠĠĠĠĠ Ġ@ Animator Res Ġ@ Anim Res Ġpop Enter : ĠInt Ġ= Ġdefault Pop Enter Animation , ĊĠĠĠĠĠĠĠ Ġ@ Animator Res Ġ@ Anim Res Ġpop Exit : ĠInt Ġ= Ġdefault Pop Exit Animation ĊĠĠĠ Ġ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġ åĲ¯åĬ¨ äºĭåĬ¡ ĊĠĠĠĠĠĠĠ Ġval Ġtransaction Ġ= Ġfragment Manager . beginTransaction () ĊĠĠĠĠĠĠĠ Ġ// Ġå¦Ĥæŀľ éľĢè¦ģ éļĲèĹı ä¸Ĭ ä¸Ģä¸ª fragment Ġ å¹¶ä¸Ķ Ġä¸Ĭ ä¸Ģä¸ª fragment ä¸į ä¸ºç©º ĊĠĠĠĠĠĠĠ Ġif Ġ( hide Last Ġ&& Ġlast Fragment Ġ!= ĠNO _ FRAGMENT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfind Fragment ( last Fragment )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . hide ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġposition éľĢè¦ģ åŃĺåľ¨ åĲĪ çĲĨ çļĦ èĮĥåĽ´ ä¸Ń ĊĠĠĠĠĠĠĠ Ġif Ġ( position Ġin Ġposition Range ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠæŁ¥ çľĭ ç®¡çĲĨ åĻ¨ ä¸Ń æĺ¯åĲ¦ å·²ç»ı åŃĺåľ¨ äºĨ fragment ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= Ġfind Fragment ( position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġå¦Ĥæŀľ åŃĺåľ¨ äºĨ ï¼Į éĤ£ä¹Ī å°± çĽ´æİ¥ æĺ¾ç¤º ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( target Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . show ( target ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġå¦Ĥæŀľ ä¸įåŃĺåľ¨ å°± æĸ° æ·»åĬł ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . add ( create Fragment ( position ), Ġget Tag ( position )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġè®¾ç½® Fragment çļĦ åĬ¨çĶ» ĊĠĠĠĠĠĠĠ Ġtransaction . set Custom Animations ( enter , Ġexit , Ġpop Enter , Ġpop Exit ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġå¦Ĥæŀľ éľĢè¦ģ è¿ĶåĽŀ æłĪ ï¼Į éĤ£ä¹Ī æ·»åĬł è¿ĶåĽŀ æłĪ ĊĠĠĠĠĠĠĠ Ġif Ġ( back Stack Enable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . addTo Back Stack (" from :$ last Fragment , to :$ position ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġ è®°å½ķ åºı åı· ĊĠĠĠĠĠĠĠ Ġlast Fragment Ġ= Ġposition ĊĠĠĠĠĠĠĠ Ġreturn Ġtransaction . commit () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ åĽŀ éĢĢ åĪ° æĮĩå®ļ ä½įç½® çļĦ äºĭåĬ¡ çĬ¶æĢģ ĊĠĠĠĠ Ġ* Ġå¦Ĥæŀľ back Stack Enable ä¸º false æĹ¶ ï¼Į æĸ¹æ³ķ ä¸įä¼ļ çĶŁ æķĪ ĊĠĠĠĠ Ġ* Ġ@ param Ġcommit Id ĠæĮĩå®ļ æıĲäº¤ id ï¼Į å¦Ĥæŀľ åľ¨ é»ĺè®¤ çļĦ æĥħåĨµä¸ĭ ï¼Į æĪĸèĢħ ä¸į è®¾ç½® çļĦ æĥħåĨµä¸ĭ ï¼Į ĊĠĠĠĠ Ġ* Ġè¡¨ç¤º ä¸į æĮĩå®ļ æıĲäº¤ çļĦ ä½įç½® ï¼Į çĽ´æİ¥ åĽŀ éĢĢ èĩ³ ä¸Ĭ ä¸Ģä¸ª çĬ¶æĢģ ĊĠĠĠĠ Ġ* Ġ@ param Ġinclusive Ġ åĽŀ éĢĢ æĹ¶ æĺ¯åĲ¦ åĮħåĲ« commit Id å¯¹åºĶçļĦ éĤ£ ä¸Ģ ç¬Ķ æıĲäº¤ ĊĠĠĠĠ Ġ* Ġå¦Ĥæŀľ ä¸º true ï¼Į éĤ£ä¹Ī è¡¨ç¤º åĽŀ éĢĢ åĪ° commit Id ä¹ĭåīį çļĦ çĬ¶æĢģ ĊĠĠĠĠ Ġ* Ġå¦Ĥæŀľ ä¸º false ï¼Į è¡¨ç¤º åĽŀ éĢĢ åĪ° commit Id å¯¹åºĶçļĦ çĬ¶æĢģ ĊĠĠĠĠ Ġ* Ġå¦Ĥæŀľ commit Id ä¸į åģļ è®¾ç½® ï¼Į éĤ£ä¹Ī æŃ¤ åıĤæķ° ä¸į çĶŁ æķĪ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġback ( commit Id : ĠInt Ġ= Ġ- 1 , Ġinclusive : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! back Stack Enable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( commit Id Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġflag Ġ= Ġif Ġ( inclusive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFragment Manager . POP _ BACK _ STACK _ INCL USIVE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Manager . pop Back Stack ( commit Id , Ġflag ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Manager . pop Back Stack () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Fragment ( position : ĠInt ): ĠFragment ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfragment Manager . find Fragment By Tag ( getTag ( position )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Fragment ( position : ĠInt ): ĠFragment Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfragment Creator . getNew Fragment ( position ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Tag ( position : ĠInt ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" L ol lip op : switch er :${ container Id }: $ position " ĊĠĠĠ Ġ} Ċ Ċ }