【Android】Fragment(一)- 生命週期

在講述Fragment的生命週期之前,我覺得有必要先對Fragment做一個簡單的介紹,閱讀英文文檔沒問題的同學,建議直接閱讀官方文檔,本人也是菜鳥,這邊的簡單介紹也只是對閱讀過官方文檔與查閱相關資料後做的一個簡單的總結(所以還是建議閱讀官方文檔,畢竟每個人的理解會有所出入)。

Fragment簡介

Fragment是一Activity中的一部分,我們可以把一個Activity分割成多個佈局模塊,每個佈局模塊對應一個Fragment,我們可以將各個佈局模塊以Fragment的形式模塊化實現,再通過Fragment的管理體系動態的改變Activity的見面顯示效果,是的Activity的界面顯示更加靈活,並且Fragment可以被重複使用,這一點使用起來非常方便。同時,Fragment也爲大屏應用的開發提供了新的天地,比如我們常見的Settings應用,在手機端需要兩個Activity,而在TAB端的應用中,將兩個Activity整合到了一個Activity中顯示出來,其中就是通過Fragment實現的。官方文檔上舉了一個新聞應用的例子(如下圖),在Tablet中,我們將FragmentA與FragmentB嵌入到ActivityA中,FragmentA顯示的是新聞標題列表,FragmentB顯示的是選中新聞標題對應的新聞內容,而如果我們需要將這個應用嵌入到手機中時,我們不需要重新開發,將之前的FragmentA潛入到ActivityA,將FragmentB嵌入到ActivityB中即可,達到了Fragment重用,縮短開發週期的效果,也爲今後多顯示屏的適配維護提供了便利。


Fragment生命週期

下面就是我們這篇文章的主要內容了,Fragment的生命週期。Fragment必須被潛入到Activity中使用,Fragment的生命週期與他所寄宿的Activity的生命週期是關聯的。比如,當Activity Paused,該Acitvity中的所有Fragment都會Paused,當Activity Destroyed,該Activity中所有的Fragment都會Paused,當Activity正在運行中時,我們可以對Fragment進行自由操作,例如添加(Add),移除(Remove),替換(Replace)等等。在官方文檔中,對於Fragment介紹那塊我們會發現一下示意圖,來闡明Fragment與Activity的生命週期的關係


Fragment用法

使用Fragment,我們必須使用創建一個Fragment子類的方式去使用Fragment,如上圖發現,Fragment跟Activity有很多相似的地方,包含了很多回掉函數,這同樣爲Activity轉換成Fragment提供了很多便利,通常,我們使用Fragment需要實現以下三個方法
onCreate:當創建Fragment的時候會調用這個方法,我們可以在這個方法中做一些組件的初始化工作。
onCreateView:當Fragment在Activity中顯示的時候調用這個方法,該方法必須返回一個View(ListFragment不需要)。
onPause:與Activity相似,當Activity暫停時,就會調用它。

示例

下面,我們創建一個Android工程來闡明這個生命週期的關聯。
1.在Eclipse中創建一個Android工程,命名爲android_fragment_lifecycle.
2.在res/layout中添加一個佈局文件,用於表示Fragment的佈局情況,(我命名爲ff.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center" >
    
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="I am a Fragment!"
        android:gravity="center" />
    

</LinearLayout>

3.在主佈局文件(默認activity_main.xml)中添加一個LinearLayout,爲Fragment留下適當的空間,LinearLayout必須要定義ID屬性
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <LinearLayout
        android:id="@+id/line"
        android:layout_width="match_parent"
        android:layout_height="150dip"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginTop="150dip"
        android:background="#FFFF0000"
        android:orientation="vertical" >
    </LinearLayout>

</RelativeLayout>

4.創建一個類,繼承自Fragment,此處我定義的類名爲Fragment,其實現如下所示,爲每個方法都添加了Log輸出
package com.example.android_fragment_lifetime;

import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class MyFragment extends Fragment {
	
	private final static String TAG = "MyFragment";
	
	@Override
	public void onAttach(Activity activity) {
		// TODO Auto-generated method stub
		super.onAttach(activity);
		Log.e(TAG, "-MyFragment- onAttach ->>");
	}
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		Log.e(TAG, "-MyFragment- onCreate ->>");
	}
	
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		Log.e(TAG, "-MyFragment- onCreateView ->>");
		View view = inflater.inflate(R.layout.ff, null);
		//return super.onCreateView(inflater, container, savedInstanceState);
		return view;
		
	}
	
	@Override
	public void onActivityCreated(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onActivityCreated(savedInstanceState);
		Log.e(TAG, "-MyFragment- onActivityCreated ->>");
	}
	
	@Override
	public void onStart() {
		// TODO Auto-generated method stub
		super.onStart();
		Log.e(TAG, "-MyFragment- onStart ->>");
	}
	
	@Override
	public void onResume() {
		// TODO Auto-generated method stub
		super.onResume();
		Log.e(TAG, "-MyFragment- onResume ->>");
	}
	
	@Override
	public void onPause() {
		// TODO Auto-generated method stub
		super.onPause();
		Log.e(TAG, "-MyFragment- onPause ->>");
	}
	@Override
	public void onStop() {
		// TODO Auto-generated method stub
		super.onStop();
		Log.e(TAG, "-MyFragment- onStop ->>");
	}
	
	@Override
	public void onDestroyView() {
		// TODO Auto-generated method stub
		super.onDestroyView();
		Log.e(TAG, "-MyFragment- onDestroyView ->>");
	}
	
	@Override
	public void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		Log.e(TAG, "-MyFragment- onDestroy ->>");
	}
	
	@Override
	public void onDetach() {
		// TODO Auto-generated method stub
		super.onDetach();
		Log.e(TAG, "-MyFragment- onDetach ->>");
	}

}

5.修改程序入口的Activity(默認爲MainActivity)
package com.example.android_fragment_lifetime;

import android.os.Bundle;
import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.util.Log;
import android.view.Menu;

public class MainActivity extends Activity {
	private final static String TAG = "MainActivity";
	
	FragmentManager manager;
	FragmentTransaction transaction;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		Log.e(TAG, "-MainActivity- onCreate ->>");
		
		manager = getFragmentManager();				//獲取該Activity的FragmentManager
		transaction = manager.beginTransaction();	//啓動Fragment業務
		MyFragment myFragment = new MyFragment();
		transaction.add(R.id.line, myFragment);		//添加一個操作業務,爲指定區域添加一個Fragment
		transaction.commit();						//提交Fragment的操作
	}
	
	
	@Override
	protected void onRestart() {
		// TODO Auto-generated method stub
		super.onRestart();
		Log.e(TAG, "-MainActivity- onRestart ->>");
	}
	
	@Override
	protected void onStart() {
		// TODO Auto-generated method stub
		super.onStart();
		Log.e(TAG, "-MainActivity- onStart ->>");
	}
	
	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();
		Log.e(TAG, "-MainActivity- onResume ->>");
	}
	
	@Override
	protected void onPause() {
		// TODO Auto-generated method stub
		super.onPause();
		Log.e(TAG, "-MainActivity- onPause ->>");
	}
	
	@Override
	protected void onStop() {
		// TODO Auto-generated method stub
		super.onStop();
		Log.e(TAG, "-MainActivity- onStop ->>");
	}
	
	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		Log.e(TAG, "-MainActivity- onDestroy ->>");
	}

}
6.運行這個Android應用,發現程序中間潛入了我們的文本數據“I am a Fragment”
7.打開LogCat查看日誌輸出








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