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解綁了
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;
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.效果圖:
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基本使用源碼下載下傳