Android fragment介紹

原文地址:http://blog.csdn.net/qianfu111/article/details/8948110 

Fragment:碎片、片段,碎片表示輕量級和靈活,是開發android平板電腦必須掌握的技術。其將界面UI進行分塊,以塊的方式組織UI,完全可以達到界面UI組件的複用。

1、 它在一個activity裏面表示一個行爲或者用戶接口的一部分。

        我們可以將不同的Fragments組合起來放到一個activity中,或者在不同的activity中重用一個fragment。你可以將一個fragment看成是一個activity中的一個片段,它有自己的生命週期(如何從創建到銷燬),接受它自己的輸入事件,並且可以在activity運行時動態的添加或者移除一個fragment。

2、  一個fragment必須總是綁定到一個activity中,雖然fragment有自己的生命週期,但同時也被它的宿主activity的生命週期直接影響。

        比如,當一個activity暫停的時候,它裏面所有的fragments也同樣暫停;當activity銷燬的時候,它裏面所有的fragment同樣也被銷燬;然而,當一個activity正在運行(它處於resumed生命週期的時候),我們可以獨立的操縱每個fragment執行注入添加和移除它們;另外,當你執行一個fragment操作的時候,你可以將它添加到一個歷史棧裏面去,這個棧是由它的宿主activity維護,每一個棧裏面的元素都是一個已經被執行過的fragment。這個堆棧可以讓我們通過返回鍵來恢復之前的fragment。

3、  fragment可以定義自己的佈局文件(layout),當然其也可以沒有自己的UI。

        當你將一個fragment作爲activity的佈局文件的一部分添加進去的時候,它就在activity的視圖層次中的ViewGroup中。(1)可以通過在activity的layout中定義<fragment>元素來定義一個類中的fragment。(2)或者在代碼中將其添加到當前的ViewGroup(視圖組合,或者稱爲視圖元素組合)中。注意:一個fragment並不一定要求是activity佈局文件的一部分,我們也可以使用一個沒有自己UI的fragment,作爲一個activity不可見的一部分。

注:Fragment是android3.0版本開始提供的技術,google爲了能夠兼容1.6以上的版本,提供了android-support-v4.jar包。可以通過SDK Manager下載AndroidSupport Package,在Extras目錄下的Android Support。使用時你需要在項目代碼頂層創建libs文件夾,並將該jar庫文件拷貝到libs裏面去。下面使用該jar來研究fragment。

4、Fragment對象的生命週期。

1、創建佈局文件layout1

[java] view plaincopy
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:layout_width="match_parent"  
  3.     android:layout_height="match_parent"  
  4.     android:layout_gravity="center"  
  5.     android:gravity="center_vertical"  
  6.     android:orientation="vertical" >  
  7.   
  8.     <TextView  
  9.         android:id="@+id/textView1"  
  10.         android:layout_width="wrap_content"  
  11.         android:layout_height="wrap_content"  
  12.         android:text="My First Fragment for android1.6"  
  13.         android:textColor="#ff00ff"  
  14.         android:textSize="33sp" />  
  15.   
  16. </LinearLayout>  

2、 創建activity_main佈局文件

[java] view plaincopy
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:gravity="center"  
  6.     android:orientation="vertical" >  
  7.   
  8.     <TextView  
  9.         android:layout_width="wrap_content"  
  10.         android:layout_height="wrap_content"  
  11.         android:layout_centerHorizontal="true"  
  12.         android:layout_centerVertical="true"  
  13.         android:text="@string/hello_world"  
  14.         tools:context=".MainActivity" />  
  15.     <fragment  
  16.         android:name="com.example.myfragment.MyFragment1"  
  17.         android:id="@+id/myfragment1"  
  18.     android:tag="MyFragment"  
  19.         android:layout_width="wrap_content"  
  20.         android:layout_height="wrap_content"/>  
  21.   
  22. </LinearLayout>  

3、創建MyFragment1

[java] view plaincopy
  1. package com.example.myfragment;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.support.v4.app.Fragment;  
  6. import android.util.Log;  
  7. import android.view.LayoutInflater;  
  8. import android.view.View;  
  9. import android.view.ViewGroup;  
  10.   
  11. public class MyFragment1 extends Fragment{  
  12.     @Override  
  13.     public void onAttach(Activity activity) {  
  14.         // TODO Auto-generated method stub  
  15.         Log.d(this.getTag(), "onAttach");  
  16.         super.onAttach(activity);  
  17.     }  
  18.   
  19.     @Override  
  20.     public void onCreate(Bundle savedInstanceState) {  
  21.         // TODO Auto-generated method stub  
  22.         Log.d(this.getTag(), "onCreate");  
  23.         super.onCreate(savedInstanceState);  
  24.     }  
  25.   
  26.     @Override  
  27.     public View onCreateView(LayoutInflater inflater, ViewGroup container,  
  28.             Bundle savedInstanceState) {  
  29.         // TODO Auto-generated method stub  
  30.         Log.d(this.getTag(), "onCreateView");  
  31.         return inflater.inflate(R.layout.layout1, container,false);  
  32.     }  
  33.   
  34.     @Override  
  35.     public void onActivityCreated(Bundle savedInstanceState) {  
  36.         // TODO Auto-generated method stub  
  37.         Log.d(this.getTag(), "onActivityCreated");  
  38.         super.onActivityCreated(savedInstanceState);  
  39.     }  
  40.   
  41.     @Override  
  42.     public void onStart() {  
  43.         // TODO Auto-generated method stub  
  44.         Log.d(this.getTag(), "onStart");  
  45.         super.onStart();  
  46.     }  
  47.   
  48.     @Override  
  49.     public void onResume() {  
  50.         // TODO Auto-generated method stub  
  51.         Log.d(this.getTag(), "onResume");  
  52.         super.onResume();  
  53.     }  
  54.   
  55.     @Override  
  56.     public void onPause() {  
  57.         // TODO Auto-generated method stub  
  58.         Log.d(this.getTag(), "onPause");  
  59.         super.onPause();  
  60.     }  
  61.   
  62.     @Override  
  63.     public void onStop() {  
  64.         // TODO Auto-generated method stub  
  65.         Log.d(this.getTag(), "onStop");  
  66.         super.onStop();  
  67.     }  
  68.   
  69.     @Override  
  70.     public void onDestroyView() {  
  71.         // TODO Auto-generated method stub  
  72.         Log.d(this.getTag(), "onDestroyView");  
  73.         super.onDestroyView();  
  74.     }  
  75.   
  76.     @Override  
  77.     public void onDestroy() {  
  78.         // TODO Auto-generated method stub  
  79.         Log.d(this.getTag(), "onDestroy");  
  80.         super.onDestroy();  
  81.     }  
  82.   
  83.     @Override  
  84.     public void onDetach() {  
  85.         // TODO Auto-generated method stub  
  86.         Log.d(this.getTag(), "onDetach");  
  87.         super.onDetach();  
  88.     }  
  89.       
  90. }  
4、創建MainActivity文件

[java] view plaincopy
  1.  package com.example.myfragment;  
  2.   
  3. import android.os.Bundle;  
  4. import android.support.v4.app.FragmentActivity;  
  5.   
  6. public class MainActivity extends FragmentActivity {  
  7. //這裏是繼承FrameActivity,而不是Activity  
  8.     @Override  
  9.     public void onCreate(Bundle savedInstanceState) {  
  10.         super.onCreate(savedInstanceState);  
  11.         setContentView(R.layout.activity_main);  
  12.     }  
  13.   
  14. }  

執行,然後再按home’鍵,再進入程序,再按back鍵,效果如下:

   

注:

1、引用了android.support.v4.app.*;包中的組件;

2、爲了兼容android1.6,MainActivity繼承於FrameActivity;

3、改代碼中fragment已寫入xml中,缺點是不能實現動態的增刪,後面的學習將使用代碼來進行添加刪除fragment。

4、onCreateView方法中,inflater.inflate(R.layout.layout1,container,false);

第一個參數把某一佈局文件轉換成view對象;

第二參數是把這個view對象放入container容器中;這個container容器其實就是activity_main的根節點,可以通過在根節點下設置tag屬性,並通過container.getTag()獲取值,再將其打印出來。

第三個參數代表是否把這個view對象添加到container容器內部,在xml中我們已經將它添加到容器內部。經測試,如果此時你再將之設置爲true,其依然能夠正確執行。

5、Fragment的生命週期分析

(1)onAttach()//當一個Fragment對象關聯到一個Activity時調用。

(2)onCreate()//初始創建Fragment對象時調用。

(3)onCreateView()//創建與Fragment對象關聯的View視圖時調用。

(4)onActivityCreated()//Activity對象完成自己的onCreate方法時調用。

(5)、onStart()//Fragment對象在ui可見時調用。

(6)onResume()//Fragment對象的ui可以與用戶交互時調用。

(7)onPause()//Fragment對象可見,但不可交互。有Activity對象轉爲onPause狀態時調用。

(8)onStop()//有空間完全遮擋;或者宿主Activity對象轉爲onStop狀態時調用。

(9)onDestroyView()//Fragment對象清理view資源時調用,也就是移除fragment中的視圖。

(10)onDestroy()//Fragment對象完成對象清理View資源時調用。

(11)onDetach()//Fragment對象沒有與Activity對象關聯時調用。

當一個fragment被創建的時候執行1-4;

當這個fragment創建完畢,到對用戶可見的時候,執行5-6;

當這個fragment從可見到不可見時,執行7-8;

當這個fragment被銷燬了(或者持有它的activity被銷燬了),執行9-11;

另外在3-5,可以使用Bundle對象保存一個fragment的對象。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章