Fragment詳解
1.Fragment為什么被稱為第五大組件
2.Fragment加載到Activity的兩種方式
3.FragmentPageAdapter與FragmentStatePagerAdapter區(qū)別
4.Fragment生命周期?
5.Fragment之間的通信
1.Fragment與Activity的通信 2.Fragment與Fragment之間的通信 3.Activity與Fragment的通信
6.Fragment管理器:FragmentManager
一.Fragment為什么被稱為第五大組件紧卒?(Activity、Service废士、ContentBrocastReceiver)
1.Fragment為什么被稱為第五大組件**
image
把View列為第五大組件蚯姆,不可取,沒有生命周期
起初是給大屏幕上更靈活的使用 弟断,一個Activity中嵌套多個Fragment來實現(xiàn)UI與數(shù)據(jù)之間的切換咏花,用到的模式更多的是Fragment+ViewPager,F(xiàn)ragment相比于Activity更節(jié)約內(nèi)存阀趴,效果也更加舒適
總結(jié):在使用頻率上不屬于四大組件昏翰,有自己的生命周期,可以靈活的在Activity中使用但不能完全獨立刘急,要依附Activity
二.Fragment加載到Activity的兩種方式
1.靜態(tài)加載.將Fragment作為一個標(biāo)簽加到activity的布局當(dāng)中
2.動態(tài)在Activity中加載(transacion--事務(wù))
1.步驟1:添加一個FragmentTransaction的實例
FragmentManager fm = this.getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
2.步驟二:用add()方法加上Fragment的對象rightFragment
RightFragment rightFragment = new RightFragment();
ft.add(R.id.right_container,rightFragment,"rightFragment");//資源id棚菊,容器標(biāo)志位
ft.addToBackStack("rightFragment");
3.步驟三:調(diào)用commit()方法使得FragmentTransaction實例的改變生效
ft.commit();
三.FragmentPageAdapter與FragmentStatePagerAdapter區(qū)別
圖1
圖2
ViewPager->內(nèi)存消耗
FragmentPageAdapter適用于頁面較少的情況,F(xiàn)ragmentStatePagerAdapter適用頁面較多的情況
在FragmentStatePagerAdapter源碼中destroyItem方法中最后一行
mCurTransaction.remove(fragment);真正的釋放了內(nèi)存
在FragmentPageAdapter源碼中destroyItem方法中最后一行
mCurTransaction.detach((Fragment)object);detach只是把Fragment的UI和Activity的UI所脫離開來叔汁,并不回收內(nèi)存
由于FragmentStatePagerAdapter在每次切換ViewPager時會回收內(nèi)存统求,而FragmentPageAdapter只是把UI進行分離,
四.Fragment生命周期攻柠?
1.單獨的Fragment生命周期
圖3
Fragment is added
->onAttach()->onCreate()->
onCreateView()(再次加載從這里開始,設(shè)置要加載的根布局即layout)->onActivityCreate()->onStart()->onResume()->
Fragment is active
->onPause()->onStop()->onDestroyView()->onDestroy()->onDetach()
->Fragment is destroyed
2.fragment從啟動到銷毀生命周期的全過程
圖1
開始創(chuàng)建Fragment對象
onAttch():表明在Fragment與Activity關(guān)聯(lián)之后回調(diào)球订,
onCreate():在Fragment初次創(chuàng)建時調(diào)用,看起來方法跟Activity的一樣瑰钮,但是這個方法只是用來創(chuàng)建Fragment冒滩,此時的Activity還并沒有創(chuàng)建完成
onCreateView:系統(tǒng)在Fragment首次繪制用戶界面時調(diào)用, 如果想要為這個Fragment繪制UI浪谴,繪制界面开睡,從該方法返回的View必須是fragment布局的根視圖
onViewCreated():界面已經(jīng)完成繪制好了因苹,這時可以初始化Fragment里頭的資源
Activity--onCreate():初始化Activity的布局之類的
onActivityCreated():這個方式在Activity渲染,繪制完成后調(diào)用
Activity--onStart():表明Activity可見了
onStart():表明Fragment可見了
Activity--onResume:整個Activity可以和用戶交互了
onResume():表示Fragment可以和用戶交互了篇恒,點擊扶檐,觸摸等
----------------->Fragment完全初始化完畢
如果要走Fragment的回退方法
onPause():表示Fragment開始不能和用戶點擊了
Activity--onPause:表示Fragment所依附的Activity開始不能和用戶交互
onStop();
Actvity-onStop()
onDestroyView():---對應(yīng)于onCreateView()表示這個Fragment即將結(jié)束,會被保存
onDestroy():表示Fragment不再被使用了
onDetach():Fragment對象銷毀
Activity--onDestroy():表示整個Activity被回收了胁艰,這個描述對嗎款筑?
五.Fragment之間的通信
1.Fragment與Activity的通信(Fragment調(diào)用Activity方法)**
1.在Fragment中調(diào)用Activity的方法 getActivity
2.Activity與Fragment的通信(在Activity中調(diào)用Fragment中的方法)**
接口回調(diào):
在Fragment中創(chuàng)建接口,Activity來實現(xiàn)
-->Fragment實現(xiàn)定義的接口腾么,Activity使用fragment對象調(diào)用該方法
3.Fragment與Fragment之間的通信**
1.方式1.fragment中獲取依附的Activity奈梳,然后通過findFragmentById獲取另外的Fragment
4.Fragment管理器:FragmentManager**
FragmentManager的三個方法:replace、add解虱、remove攘须、
1.add():將一個Fragment的實例添加到Activity的最上層,最上層是指殴泰?
2.remove():將Fragment實例從Activity的Fragment隊列中刪除
3.replace():將Activity最上層的Fragment替換成想要的Fragment于宙,這主要有的區(qū)別