原文地址: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
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_gravity="center"
- android:gravity="center_vertical"
- android:orientation="vertical" >
- <TextView
- android:id="@+id/textView1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="My First Fragment for android1.6"
- android:textColor="#ff00ff"
- android:textSize="33sp" />
- </LinearLayout>
2、 創建activity_main佈局文件
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:gravity="center"
- android:orientation="vertical" >
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_centerHorizontal="true"
- android:layout_centerVertical="true"
- android:text="@string/hello_world"
- tools:context=".MainActivity" />
- <fragment
- android:name="com.example.myfragment.MyFragment1"
- android:id="@+id/myfragment1"
- android:tag="MyFragment"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
- </LinearLayout>
3、創建MyFragment1
- package com.example.myfragment;
- import android.app.Activity;
- import android.os.Bundle;
- import android.support.v4.app.Fragment;
- import android.util.Log;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup;
- public class MyFragment1 extends Fragment{
- @Override
- public void onAttach(Activity activity) {
- // TODO Auto-generated method stub
- Log.d(this.getTag(), "onAttach");
- super.onAttach(activity);
- }
- @Override
- public void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- Log.d(this.getTag(), "onCreate");
- super.onCreate(savedInstanceState);
- }
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- Log.d(this.getTag(), "onCreateView");
- return inflater.inflate(R.layout.layout1, container,false);
- }
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- Log.d(this.getTag(), "onActivityCreated");
- super.onActivityCreated(savedInstanceState);
- }
- @Override
- public void onStart() {
- // TODO Auto-generated method stub
- Log.d(this.getTag(), "onStart");
- super.onStart();
- }
- @Override
- public void onResume() {
- // TODO Auto-generated method stub
- Log.d(this.getTag(), "onResume");
- super.onResume();
- }
- @Override
- public void onPause() {
- // TODO Auto-generated method stub
- Log.d(this.getTag(), "onPause");
- super.onPause();
- }
- @Override
- public void onStop() {
- // TODO Auto-generated method stub
- Log.d(this.getTag(), "onStop");
- super.onStop();
- }
- @Override
- public void onDestroyView() {
- // TODO Auto-generated method stub
- Log.d(this.getTag(), "onDestroyView");
- super.onDestroyView();
- }
- @Override
- public void onDestroy() {
- // TODO Auto-generated method stub
- Log.d(this.getTag(), "onDestroy");
- super.onDestroy();
- }
- @Override
- public void onDetach() {
- // TODO Auto-generated method stub
- Log.d(this.getTag(), "onDetach");
- super.onDetach();
- }
- }
- package com.example.myfragment;
- import android.os.Bundle;
- import android.support.v4.app.FragmentActivity;
- public class MainActivity extends FragmentActivity {
- //這裏是繼承FrameActivity,而不是Activity
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- }
- }
執行,然後再按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的對象。