Android實習札記(4)---Fragment(碎片)基本概念解析html
轉載請註明出處:coder-pigjava
Fragment相信你們都不會陌生吧,側滑啦,抽屜效果啦,DialogFragment啊等等,一堆地方都會android
用到Fragment,對於Fragment的基本概念在前面的文章中其實已經給出的了,這裏回顧一遍,api
溫故而知新嘛,同時結合Google官方的api進行復習!app
核心要點:ide
1)3.0版本後引入,即minSdk要大於11佈局
2)Fragment須要嵌套在Activity中使用,固然也能夠嵌套到另一個Fragment中,但這個被嵌套this
的Fragment也是須要嵌套在Activity中的,間接地說,Fragment仍是須要嵌套在Activity中!!受寄主spa
Activity的生命週期影響,固然他也有本身的生命週期!另外不建議在Fragment裏面嵌套Fragment.net
由於嵌套在裏面的Fragment生命週期不可控!!!
3)官方文檔說建立Fragment時至少須要實現三個方法:onCreate( ),onCreateView( ),OnPause( );
不過貌似只寫一個onCreateView也是能夠的...
4)Fragment的生命週期和Activity有點相似:三種狀態:
Resumed:在容許中的Fragment可見 Paused:所在Activity可見,可是得不到焦點
Stoped:
①調用addToBackStack(),Fragment被添加到Bcak棧
②該Activity轉向後臺,或者該Fragment被替換/刪除
ps:中止狀態的fragment仍然活着(全部狀態和成員信息被系統保持着),然而,它對用戶
再也不可見,而且若是activity被幹掉,他也會被幹掉.
5)Fragment的子類有:
對話框:DialogFragment 列表:ListFragment
選項設置:PreferenceFragment WebView界面:WebViewFragment
step 1:定義Fragment的佈局,就是fragment顯示內容的
step 2:自定義一個Fragment類,須要繼承Fragment或者他的子類,重寫onCreateView()方法
在該方法中調用:inflater.inflate()方法加載Fragment的佈局文件,接着返回加載的view對象
參數依次是:要加載的fragment佈局;加載的fragment所在的父ViewGroup;而第三個參數則是:
是否將父ViewGroup添加到佈局文件的根視圖上,可是這樣可能會產生一個多餘的ViewGroup
對象;這裏不理解的話就算了,寫false就能夠了
另外inflate方法還有其餘的形式,一種典型的就是直接inflate(要顯示佈局,null),
若是使用這種的話:item佈局中的根視圖的layout_XX屬性會被忽略掉,而後設置成默認的包裹
內容方式,因此仍是建議使用三個參數的inflate()吧!詳細原因可參考:
http://www.2cto.com/kf/201407/313054.html
step 3:在須要加載Fragment的Activity對應的佈局文件中添加fragment的標籤,
記住,name屬性是全限定類名哦,就是要包含Fragment的包名,如:
step 4:Activity在onCreate( )方法中調用setContentView()加載佈局文件便可!
step 1:調用getFragmentManager得到FragmentManager對象fm
step 2.fm調用beginTransaction( )方法得到Fragment事務對象bt
step 3:bt調用add( )添加或者relpace( )替換Fragment,參數都是同樣的
第一個參數是要傳入的容器,第二個參數是Fragment對象
step 4:最後還須要調用bt.commit( )提交事務,除了add和replace方法外
還有個remove移除Fragment的方法,一樣也是須要commit的!
局部代碼:
ps:這裏的代碼是app包下的使用fragment,因此導入的與Fragment有關的包都要是app哦!!!
另外爲了低版本兼容也能夠用v4包,改點東西而已,詳細解析請見:
Fragment得到Activity中的組件:
getActivity().findViewById(R.id.list)
Activity得到Fragment中的組件(根據id和tag均可以):
getFragmentManager.findFragmentByid(R.id.fragment1);
在Activity中建立Bundle數據包,調用Fragment實例的setArguments(bundle)
從而將Bundle數據包傳給Fragment,而後Fragment中調用getArguments得到
Bundle對象,而後進行解析就能夠了
在Fragment中定義一個內部回調接口,再讓包含該Fragment的Activity實現該回調接口,
Fragment就能夠經過回調接口傳數據了,回調,相信不少人都知道是什麼玩意,可是
寫不出來啊,網上的一百度"fragment傳數據給Activity",全是李剛老師的那個代碼,真心無語
算了,這裏就寫下局部代碼吧,相信讀者一看就懂的了:
step 1:定義一個回調接口:(Fragment中)
step 2:接口回調(fragment中)
step 3:使用接口回調方法讀數據(Activity中)
總結來講,就是
->在Fragment定義一個接口,接口中定義抽象方法,你要傳什麼類型的數據
參數就設置爲何類型;
->接着還有寫一個調用接口中的抽象方法,把要傳遞的數據傳過去
->再接着就是Activity了,調用Fragment提供的那個方法,而後重寫抽象方法的時候進行數據
的讀取就能夠了!!!
其實這很簡單,找到要接受數據的fragment對象,直接調用setArguments傳數據進去就能夠了
一般的話是replace時,即fragment跳轉的時候傳數據的,那麼只須要在初始化要跳轉的Fragment
後調用他的setArguments方法傳入數據便可!
大概代碼以下:
若是是兩個Fragment須要即時傳數據,而非跳轉的話,就須要先在Activity得到f1傳過來的數據,再傳
到f2了
Activity管理Fragment主要依靠FragmentManager能夠調用findFragmentById( )獲取指定的fragment
也能夠調用popBackStack( )方法彈出後臺Fragment;也能夠調用addToBackStack(null)加入棧
或者監聽後臺棧的變化:addOnBackStackChangeListener
若是是增刪替換Fragment的話,則須要藉助FragmentTransaction對象;
同時執行Fragment的操做後,記得操做完後再使用commit( )方法提交事務哦!
相信上面的生命週期圖一時半會你也是記不住的,最後就初略地講下大概流程吧:
①Activity加載Fragment的時候,依次調用下面的方法:
onAttach -> onCreate -> onCreateView -> onActivityCreated -> onStart ->onResume;
②當咱們弄出一個懸浮的對話框風格的Activity,或者其餘,就是讓Fragment所在的Activity可見,但不得到焦點
onPause
③當對話框關閉,Activity又得到了焦點:
onResume
④當咱們替換Fragment,並調用addToBackStack()將他添加到Back棧中
onPause -> onStop -> onDestoryView
注意,此時的Fragment尚未被銷燬哦!!!
⑤當咱們按下鍵盤的回退鍵,Fragment會再次顯示出來:
onCreateView -> onActivityCreated -> onStart -> onResume;
⑥若是咱們替換後,在事務commit以前沒有調用addToBackStack()方法將
Fragment添加到back棧中的話;又或者退出了Activity的話,那麼Fragment將會被徹底結束,
Fragment會進入銷燬狀態
onPause -> onStop -> onDestoryView -> onDestory -> onDetach
http://blog.csdn.net/coder_pig/article/details/41075031