天天看點

Fragment的解析與使用(一)1.什麼是Fragment2.Fragment的生命周期(!!!!!!)3.Fragment的向下相容4.Fragment家族常用的API5.Fragment的基本使用

1.什麼是Fragment

Fragment就是小型的Activity,它是在Android3.0時出現的。(清單檔案中的 android:minSdkVersion="8"要改成11除非使用support-V4.jar向下相容)

Fragment是表現Activity中UI的一個行為或者一部分。可以把fragment想象成activity的一個子產品化區域,有它自己的生命周期,接收屬于它自己的輸入事件,并且可以在activity運作期間添加和删除(有點像一個可以在不同的activity中重用的“子Activity”)。

Fragment必須被嵌入到一個activity中。它們的生命周期直接受其宿主activity的生命周期影響。當一個activity正在運作時,就可以獨立地操作每一個Fragment,比如添加或删除它們。

Fragment可以定義自己的布局、生命周期回調方法,是以可以将fragment重用到多個activity中,是以可以根據不同的螢幕尺寸或者使用場合改變fragment組合。

2.Fragment的生命周期(!!!!!!)

   Fragment的生命周期和activity生命周期很像。

   onAttach:綁定到activity(這時候activity還沒有建立完成,但是已經存在了)

   onCreate:建立fragment

   onCreateView: 建立fragment的布局

   onActivityCreated: activity建立完成後

   onStart: 可見, 不可互動

   onResume: 可見, 可互動

    onPause: 部分可見, 不可互動

    onStop:不可見

    onDestroyView: 銷毀fragment的view對象

    onDestroy: fragment銷毀了

    onDetach: 從activity解綁了

Fragment的解析與使用(一)1.什麼是Fragment2.Fragment的生命周期(!!!!!!)3.Fragment的向下相容4.Fragment家族常用的API5.Fragment的基本使用

3.Fragment的向下相容

  Fragment是在Android 3.0才推出的,若想在3.0的低版本下使用Fragment,則需要執行下面2步:

· MainActivity extends FragmentActivity把Activity的繼承改為FragmentActivity(support-v4包下的)(原來是entends Activity)

· 所有的fragment的導包, android.support.v4.app.Fragment

· getSupportFragmentManager();(原來是FragmentManager())

· 注意兩個導包

import android.support.v4.app.FragmentManager;

import android.support.v4.app.FragmentTransaction;

Fragment的解析與使用(一)1.什麼是Fragment2.Fragment的生命周期(!!!!!!)3.Fragment的向下相容4.Fragment家族常用的API5.Fragment的基本使用

4.Fragment家族常用的API

Fragment常用的三個類:

android.app.Fragment 主要用于定義Fragment

android.app.FragmentManager 主要用于在Activity中操作Fragment

android.app.FragmentTransaction 保證一些列Fragment操作的原子性(也就是要麼都成功成功,要麼都失敗,沒有部分成功或者部分失敗),熟悉事務這個詞,一定能明白~

a、擷取FragmentManage的方式:

getFragmentManager() // v4中,getSupportFragmentManager

b、主要的操作都是FragmentTransaction的方法

FragmentTransaction transaction = fm.benginTransatcion();//開啟一個事務

transaction.add() 

往Activity中添加一個Fragment

transaction.remove() 

從Activity中移除一個Fragment,如果被移除的Fragment沒有添加到回退棧(回退棧後面會詳細說),這個Fragment執行個體将會被銷毀。

transaction.replace()

使用另一個Fragment替換目前的,實際上就是remove()然後add()的合體

transaction.hide()

隐藏目前的Fragment,僅僅是設為不可見,并不會銷毀

transaction.show()

顯示之前隐藏的Fragment

detach()

會将view從UI中移除,和remove()不同,此時fragment的狀态依然由FragmentManager維護。

attach()

重建view視圖,附加到UI上并顯示。

transatcion.commit()//送出一個事務

注意:常用Fragment的哥們,可能會經常遇到這樣Activity狀态不一緻:State loss這樣的錯誤。主要是因為:commit方法一定要在Activity.onSaveInstance()之前調用。(也可以通過用那個忽略Actvity狀态的送出方式送出)

值得注意的是:如果你喜歡使用Fragment,一定要清楚這些方法,哪個會銷毀視圖,哪個會銷毀執行個體,哪個僅僅隻是隐藏,這樣才能更好的使用它們。

a、比如:我在FragmentA中的EditText填了一些資料,當切換到FragmentB時,如果希望會到A還能看到資料,則适合你的就是hide和show;也就是說,希望保留使用者操作的面闆,你可以使用hide和show,當然了不要使勁在那new執行個體,進行下非null判斷。

b、再比如:我不希望保留使用者操作,你可以使用remove(),然後add();或者使用replace()這個和remove,add是相同的效果。

c、remove和detach有一點細微的差別,在不考慮回退棧的情況下,remove會銷毀整個Fragment執行個體,而detach則隻是銷毀其視圖結構,執行個體并不會被銷毀。那麼二者怎麼取舍使用呢?如果你的目前Activity一直存在,那麼在不希望保留使用者操作的時候,你可以優先使用detach。

5.Fragment的基本使用

1.效果圖:

Fragment的解析與使用(一)1.什麼是Fragment2.Fragment的生命周期(!!!!!!)3.Fragment的向下相容4.Fragment家族常用的API5.Fragment的基本使用
Fragment的解析與使用(一)1.什麼是Fragment2.Fragment的生命周期(!!!!!!)3.Fragment的向下相容4.Fragment家族常用的API5.Fragment的基本使用

2.布局  Activity_main.xml

<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:orientation="vertical"
    tools:context=".MainActivity" >

    <FrameLayout
        android:id="@+id/fl_container"
        android:layout_width="fill_parent"
        android:layout_weight="1"
        android:layout_height="0dip" >
    </FrameLayout>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="#22000000"
        android:orientation="horizontal" >

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="setting01"
            android:text="藍牙設定" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="setting02"
            android:text="聲音設定" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="setting03"
            android:text="顯示設定" />
    </LinearLayout>

</LinearLayout>
           

3.主要代碼

MainActivity.java

public class MainActivity extends FragmentActivity {
	private FragmentManager fm;
	BlueToothFragment f1;
	ShowFragment f3;
	SoundFragment f2;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		//為了向下相容采用v4包裡面的FragmentManager
		fm = getSupportFragmentManager();
		initFragment();
		//事務的概念
		FragmentTransaction ft = fm.beginTransaction();
		ft.replace(R.id.fl_container, f1);
		ft.commit();//保證了 要麼同時成功,要麼同時失敗
	}

	private void initFragment() {
		f1 = new BlueToothFragment();
		f2 = new SoundFragment();
		f3 = new ShowFragment();
	}

	//藍牙
	public void setting01(View view) {
		//事務的概念
		FragmentTransaction ft = fm.beginTransaction();
		ft.replace(R.id.fl_container, f1);
		ft.commit();//保證了 要麼同時成功,要麼同時失敗
	}
	//聲音
	public void setting02(View view) {
		//事務的概念
		FragmentTransaction ft = fm.beginTransaction();
		ft.replace(R.id.fl_container, f2);
		ft.commit();//保證了 要麼同時成功,要麼同時失敗
	}
	//顯示
	public void setting03(View view) {
		//事務的概念
		FragmentTransaction ft = fm.beginTransaction();
		ft.replace(R.id.fl_container, f3);
		ft.commit();//保證了 要麼同時成功,要麼同時失敗
	}

}
           

//BlueToothFragment.java

public class BlueToothFragment extends Fragment {
	//顯示Fragment的ui的
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		return inflater.inflate(R.layout.blue_tooth_layout, null);
	} 
}
           

Fragment基本使用源碼下載下傳

繼續閱讀