推薦騰訊官方的一篇文章
https://mp.weixin.qq.com/s/dUuGSVhWinAnN9uMiBaXgw
1.第五大組件
(1). 原因
fragment 不屬于四大組件,有自己的生命后期,動(dòng)態(tài)靈活的加載到activity中,并不是完全獨(dú)立,需要依賴activity
節(jié)約內(nèi)存,ui切換效果更加舒適
(2).加載Activity的2種方式
靜態(tài)加載
fragment 直接寫入 xml 文件中
動(dòng)態(tài)加載
使用FragmentManager來(lái)管理
(3). FragmentPagerAdapter 與 FragmentStatePagerAdapter
FragmentPagerAdapter 適用于頁(yè)面較少的情況
源碼中進(jìn)行的 detach操作 ,只是UI脫離,并沒(méi)有釋放內(nèi)存
FragmentStatePagerAdapter viewPager切換時(shí)適用于頁(yè)面較多的情況 ,
源碼中進(jìn)行了remove Fragment 操作 釋放了內(nèi)存
2.生命周期
結(jié)合activity
這個(gè)圖的生命周期暫不確定
3.fragment之間的通信
a). 在fragment 中調(diào)用 activity中方法
- getActivity()
- fragment向activity 中傳數(shù)據(jù) 使用接口
首先,在Fragment中定義接口,并讓Activity實(shí)現(xiàn)該接口(具體實(shí)現(xiàn)省略):
public interface OnFragmentInteractionListener { void onItemClick(String str); //將str從Fragment傳遞給Activity}
在Fragment的onAttach()中,將參數(shù)Context強(qiáng)轉(zhuǎn)為OnFragmentInteractionListener對(duì)象:
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof OnFragmentInteractionListener) {
mListener = (OnFragmentInteractionListener) context;
} else {
throw new RuntimeException(context.toString()
+ " must implement OnFragmentInteractionListener");
}
}
并在Fragment合適的地方調(diào)用mListener.onItemClick("hello")將”hello”從Fragment傳遞給Activity
b).在Activity 中調(diào)用fragment中的方法
- 獲取Fragment對(duì)象,并調(diào)用Fragment的方法
Fragment中定義方法:
public void setString(String str) {
this.str = str;
}
并在Activity中調(diào)用fragment.setString("hello")即可。
- 可以同樣使用接口
c). Fragment之間通信
由于Fragment之間是沒(méi)有任何依賴關(guān)系的,因此如果要進(jìn)行Fragment之間的通信,建議通過(guò)Activity作為中介,不要Fragment之間直接通信。
可以先 getActivity()來(lái)獲取 activity ,在通過(guò) findFragmentById() 來(lái)獲取另一個(gè)fragment
3.FragmentManager管理器
Fragment 的 replace 、add 、remove 方法
FragmentTransaction有一些基本方法,下面給出調(diào)用這些方法時(shí),F(xiàn)ragment生命周期的變化:
- add(): onAttach()->…->onResume()。
- remove(): onPause()->…->onDetach()。
- replace(): 相當(dāng)于舊Fragment調(diào)用remove(),新Fragment調(diào)用add()。
- show(): 不調(diào)用任何生命周期方法,調(diào)用該方法的前提是要顯示的Fragment已經(jīng)被添加到容器,只是純粹把Fragment UI的setVisibility為true。
- hide(): 不調(diào)用任何生命周期方法,調(diào)用該方法的前提是要顯示的Fragment已經(jīng)被添加到容器,只是純粹把Fragment UI的setVisibility為false。
- detach(): onPause()->onStop()->onDestroyView()。UI從布局中移除,但是仍然被FragmentManager管理。
- attach(): onCreateView()->onStart()->onResume()。