Fragment詳解

推薦騰訊官方的一篇文章
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.生命周期

image.png

結(jié)合activity


image.png

這個(gè)圖的生命周期暫不確定


image.png

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()。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 一. Fragment簡(jiǎn)介 我們都知道,Android上的界面展示都是通過(guò)Activity實(shí)現(xiàn)的,Activity...
    alsheng閱讀 2,477評(píng)論 0 8
  • 一、使用詳解 (1)Handler使用 (2)Handler構(gòu)造方法 Handler():構(gòu)造函數(shù)將通過(guò)調(diào)用Loo...
    kjy_112233閱讀 682評(píng)論 0 0
  • 引言:這篇文章,大概分析下Fragment的生命周期、實(shí)際應(yīng)用方法以及使用Fragment時(shí)需要注意的地方,算是F...
    androidjp閱讀 12,989評(píng)論 10 104
  • 牛牛到訪,這兩天全程陪同,真心是累死寶寶了,沙面、圣心教堂、長(zhǎng)隆、天后宮、太古貴、小蠻腰,以前都是睡過(guò)去的周末居然...
    再也不洗碗閱讀 110評(píng)論 0 0
  • -1- 寫多了太多干巴巴的時(shí)間管理類干貨文章,今天我們換一個(gè)風(fēng)格,談一談遲到這件事。 今年我們專業(yè)課的老師被師哥師...
    用時(shí)間釀酒閱讀 3,233評(píng)論 28 57