Android Fragment

Android實習札記(4)---Fragment(碎片)基本概念解析html

轉載請註明出處:coder-pigjava

Fragment相信你們都不會陌生吧,側滑啦,抽屜效果啦,DialogFragment啊等等,一堆地方都會android

用到Fragment,對於Fragment的基本概念在前面的文章中其實已經給出的了,這裏回顧一遍,api

溫故而知新嘛,同時結合Google官方的api進行復習!app

 

1)什麼是Fragment以及它的生命週期:

 

 

核心要點: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

 

 

 

 

 

2)如何去建立一個Fragment?

 

①靜態添加Fragment

 

step 1:定義Fragment的佈局,就是fragment顯示內容的

step 2:自定義一個Fragment類,須要繼承Fragment或者他的子類,重寫onCreateView()方法

在該方法中調用:inflater.inflate()方法加載Fragment的佈局文件,接着返回加載的view對象

 

[java]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
  1. public class Fragmentone extends Fragment {  
  2.     @Override  
  3.     public View onCreateView(LayoutInflater inflater, ViewGroup container,  
  4.             Bundle savedInstanceState) {  
  5.         View view = inflater.inflate(R.layout.fragment1, container,false);  
  6.         return view;  
  7.     }     
  8. }  

 

 

參數依次是:要加載的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的包名,如:

 

[html]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
  1. <fragment  
  2.     android:id="@+id/fragment1"  
  3.     android:name="com.jay.example.fragmentdemo.Fragmentone"  
  4.     android:layout_width="match_parent"  
  5.     android:layout_height="0dp"  
  6.     android:layout_weight="1" />  

step 4:Activity在onCreate( )方法中調用setContentView()加載佈局文件便可!

 

 

 

 

 

②動態添加Fragment

 

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的!

局部代碼:

 

[java]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
  1. Fragment1 f1 = new Fragment1();  
  2. getFragmentManager().beginTransaction().replace(R.id.LinearLayout1, f1).commit();  

 

ps:這裏的代碼是app包下的使用fragment,因此導入的與Fragment有關的包都要是app哦!!!

另外爲了低版本兼容也能夠用v4包,改點東西而已,詳細解析請見:

Fragment用app包仍是v4包詳解

 

 

 

 

 

 

 

 

3)Fragment與Activity的交互

①組件獲取:

Fragment得到Activity中的組件:    

getActivity().findViewById(R.id.list)

Activity得到Fragment中的組件(根據id和tag均可以):        

getFragmentManager.findFragmentByid(R.id.fragment1);           

 

 

②數據傳遞

 

1.Activit傳遞數據給Fragment:      

在Activity中建立Bundle數據包,調用Fragment實例的setArguments(bundle)

從而將Bundle數據包傳給Fragment,而後Fragment中調用getArguments得到

Bundle對象,而後進行解析就能夠了

 

 

2.Fragment傳遞數據給Activity

在Fragment中定義一個內部回調接口,再讓包含該Fragment的Activity實現該回調接口,

Fragment就能夠經過回調接口傳數據了,回調,相信不少人都知道是什麼玩意,可是

寫不出來啊,網上的一百度"fragment傳數據給Activity",全是李剛老師的那個代碼,真心無語

算了,這裏就寫下局部代碼吧,相信讀者一看就懂的了:

 

step 1:定義一個回調接口:(Fragment中)

 

[java]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
  1. /*接口*/    
  2.    public interface CallBack{    
  3.        /*定義一個獲取信息的方法*/    
  4.        public void getResult(String result);    
  5.    }    


step 2:接口回調(fragment中)

 

 

[java]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
  1. /*接口回調*/    
  2.     public void getData(CallBack callBack){    
  3.         /*獲取文本框的信息,固然你也能夠傳其餘類型的參數,看需求咯*/    
  4.         String msg = editText.getText().toString();    
  5.         callBack.getResult(msg);    
  6.     }    


step 3:使用接口回調方法讀數據(Activity中)

 

 

[java]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
  1. /* 使用接口回調的方法獲取數據 */    
  2. leftFragment.getData(new CallBack() {    
  3.  @Override    
  4.        public void getResult(String result) {              /*打印信息*/    
  5.             Toast.makeText(MainActivity.this, "-->>" + result, 1).show();    
  6.             }  
  7.         });    



總結來講,就是

->在Fragment定義一個接口,接口中定義抽象方法,你要傳什麼類型的數據

參數就設置爲何類型;

->接着還有寫一個調用接口中的抽象方法,把要傳遞的數據傳過去

->再接着就是Activity了,調用Fragment提供的那個方法,而後重寫抽象方法的時候進行數據

的讀取就能夠了!!!

 

 

3.Fragment與Fragment傳數據

 

其實這很簡單,找到要接受數據的fragment對象,直接調用setArguments傳數據進去就能夠了

一般的話是replace時,即fragment跳轉的時候傳數據的,那麼只須要在初始化要跳轉的Fragment

後調用他的setArguments方法傳入數據便可!

大概代碼以下:

 

[java]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
  1. FragmentManager fManager = getSupportFragmentManager( );  
  2. FragmentTransaction fTransaction = fManager.beginTransaction();  
  3. Fragmentthree t1 = new Fragmentthree();  
  4. Fragmenttwo t2 = new Fragmenttwo();  
  5. Bundle bundle = new Bundle();  
  6. bundle.putString("key",id);  
  7. t2.setArguments(bundle);   
  8. fTransaction.add(R.id.fragmentRoot, t2, "~~~");    
  9. fTransaction.addToBackStack(t1);    
  10. fTransaction.commit();    



 

若是是兩個Fragment須要即時傳數據,而非跳轉的話,就須要先在Activity得到f1傳過來的數據,再傳

到f2了

 

 

 

 

4)Fragment管理與Fragment事務:

①管理:

Activity管理Fragment主要依靠FragmentManager能夠調用findFragmentById( )獲取指定的fragment

也能夠調用popBackStack( )方法彈出後臺Fragment;也能夠調用addToBackStack(null)加入棧

或者監聽後臺棧的變化:addOnBackStackChangeListener

 

 

②事務

若是是增刪替換Fragment的話,則須要藉助FragmentTransaction對象;

同時執行Fragment的操做後,記得操做完後再使用commit( )方法提交事務哦!

 

 

 

5)最後說幾句:

相信上面的生命週期圖一時半會你也是記不住的,最後就初略地講下大概流程吧:

①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

相關文章
相關標籤/搜索