Fragments Github
前言
日常Fragmnet場(chǎng)景很多孕豹,很多應(yīng)用都是采用全Fragment開(kāi)發(fā) Activity只當(dāng)作承載作用。
平時(shí)開(kāi)發(fā)中調(diào)用Fragment 是這樣:
getSupportFragmentManager().beginTransaction().replace(id,xxxFragment,"tag").commit();
如果需要傳遞參數(shù)的話寫(xiě)法就是這樣:
Fragment xxxFragment=new Fragment();
Bundle bundle=new Bundle();
bundle.putXXX();
xxxFragment.setArguments(bundle);
getSupportFragmentManager().beginTransaction().replace(id,xxxFragment,"tag").commit();
要是實(shí)現(xiàn)一個(gè)跳轉(zhuǎn)可以點(diǎn)擊返回鍵實(shí)現(xiàn)返回 需要getSupportFragmentManager().beginTransaction().addToBackStack
如果屏幕旋轉(zhuǎn)或者其它異常情況又需要單獨(dú)的去處理,當(dāng)應(yīng)用的場(chǎng)景越多這樣重復(fù)的代碼就會(huì)是重復(fù)勞動(dòng)得不償失
實(shí)現(xiàn)
采用Builder模式 配置參數(shù) 調(diào)用方式類似Gilde Picaso 一樣傳入基本參數(shù)然后進(jìn)行調(diào)用
基本的調(diào)用
Fragments.with(this)
.fragment(Fragment1.class)
.into(R.id.test);
傳入的Fragment
- Fragment的Class 通過(guò)反射生成對(duì)應(yīng)的Fragmen對(duì)象
Fragment.instantiate(context, fClass.getName(), bundle)
- 實(shí)例化好的Fragment對(duì)象
FragmentManager也分為兩種情況
- 傳入FragmentActivity調(diào)用的是
getSupportFragmentManager()
- 傳入Fragment則調(diào)用
fragment.getChildFragmentManager()
Fragment的緩存
對(duì)應(yīng)的方法為Fragment.Builder().single();
默認(rèn)的就打開(kāi)如果Activity已經(jīng)加載過(guò)且沒(méi)有被remove,會(huì)在再次調(diào)用的時(shí)候在FragmentManager中讀取出緩存的Fragment對(duì)象。這樣也會(huì)避免屏幕旋轉(zhuǎn)以及其它異常中重新實(shí)例化一個(gè)Fragmen對(duì)象并加載 。關(guān)閉緩存默認(rèn)不設(shè)置tag 如果開(kāi)啟removeOld則會(huì)被remove
Ps.在實(shí)際使用中Gilde加載圖片會(huì)生成一個(gè)隱藏的Fragment使用需要注意 不然Fragmen切換圖片就會(huì)被銷毀
傳值
傳值定義了所有日常用到的基本類型 如果沒(méi)有你需要的傳值則傳入Bundle對(duì)象模狭。傳入實(shí)例化的Fragment的getArguments也會(huì)默認(rèn)添加進(jìn)所有Bundle集合不需要做多余的處理
加載
最后的調(diào)用有into(R.id.test)
和get()
into是直接調(diào)用顯示到對(duì)應(yīng)的viewGroup id 對(duì)象
,get() 調(diào)用是獲取生成的Fragment對(duì)象 踩衩。兩個(gè)方法都返回了fragment生成的對(duì)象
引用方式
implementation 'com.chaek.android:fragments:1.0.0'
NOTE
如參數(shù)定義沒(méi)有你開(kāi)發(fā)中遇到的場(chǎng)景或者遇到問(wèn)題嚼鹉,請(qǐng)?zhí)岢鰜?lái)讓他更加完善