前言
謝謝你那么的书劝、安靜的捧場墅拭。
Fragment的概述及其設(shè)計初衷
Fragment代表了Activity的子模塊歉铝,因此可以把Fragment理解成Activity片段宿亡。Fragment必須被“嵌入”Activity中使用碑诉,因此彪腔,雖然Fragment也擁有自己的生命周期,但Fragment的生命周期會受到它所在的Activity的生命周期控制进栽。只有當(dāng)該Activity處于活動狀態(tài)時漫仆,程序員才可通過方法獨立操作Fragment。
關(guān)于Fragment泪幌,可以歸納出如下幾個特征盲厌。
Fragment總是作為Activity界面的組成部分。Fragment可調(diào)用getActivity()方法獲取它所在的Activity祸泪,Activity可調(diào)用FragmentManager的findFragmentById()或findFragmentByTag()方法來獲取Fragment吗浩。
在Activity運行過程中,可調(diào)用FragmentManager的add()没隘、remove()懂扼、replace()方法動態(tài)地添加、刪除或替換Fragment右蒲。
一個Activity可以同時組合多個Fragment阀湿;反過來,一個Fragment也可被多個Activity復(fù)用瑰妄。
Fragment可以響應(yīng)自己的輸入事件陷嘴,并擁有自己的生命周期,但它們的生命周期直接被其所屬的Activity的生命周期控制间坐。
Fragment的初衷是為了適應(yīng)大屏幕的平板電腦灾挨,由于平板電腦的屏幕比手機(jī)屏幕更大,因此可以容納更多的UI組件竹宋,且這些UI組件之間存在交互關(guān)系劳澄。Fragment簡化了大屏幕UI的設(shè)計,它不需要開發(fā)者管理組件包含關(guān)系的復(fù)雜變化蜈七,開發(fā)者使用Fragment對UI組件進(jìn)行分組秒拔、模塊化管理,就可以更方便地在運行過程中動態(tài)更新Activity的用戶界面飒硅。
Fragment的生命周期
與Activity類似的是砂缩,F(xiàn)ragment也存在如下狀態(tài)。
運行狀態(tài):當(dāng)前Fragment位于前臺狡相,用戶可見梯轻,可以獲得焦點。
暫停狀態(tài):其他Activity位于前臺尽棕,該Fragment依然可見喳挑,只是不能獲得焦點。
停止?fàn)顟B(tài):該Fragment不可見,失去焦點伊诵。
銷毀狀態(tài):該Fragment被完全刪除单绑,或該Fragment所在的Activity被結(jié)束。
下圖顯示了Fragment的生命周期及相關(guān)回調(diào)方法曹宴。
從圖中可以看出搂橙,在Fragment的生命周期中,如下方法被系統(tǒng)回調(diào)笛坦。
onAttach():當(dāng)該Fragment被添加到Activity時被回調(diào)区转。該方法只會被調(diào)用一次。
onCreate():創(chuàng)建Fragment時被調(diào)用版扩。該方法只會被調(diào)用一次废离。
onCreateView():每次創(chuàng)建、繪制該Fragment的View組件時回調(diào)該方法礁芦,F(xiàn)ragment將會顯示該方法返回的View組件蜻韭。
onActivityCreated():當(dāng)Fragment所在的Activity被啟動完成后回調(diào)該方法。
onStart():啟動Fragment時被調(diào)用柿扣。
onResume():恢復(fù)Fragment時被回調(diào)肖方,在OnStart()方法后一定會調(diào)用onResume()方法。
onPause():暫停Fragment時被回調(diào)未状。
onStop():停止Fragment時被回調(diào)俯画。
onDestroyView():銷毀該Fragment所包含的View組件時調(diào)用。
onDestroy():銷毀該Fragment時被毀掉娩践。該方法只會調(diào)用一次活翩。
onDetach():將該Fragment從Activity中刪除、替換完成時回調(diào)該方法翻伺,在onDestroy()方法后一定會回調(diào)onDetach()方法。該方法只會被調(diào)用一次沮焕。
代碼示例
LifecycleFragment.java
public class LifecycleFragment extends Fragment {
final String TAG = "--halo--";
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Log.d(TAG, "---onActivityCreated---");
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
Log.d(TAG, "---onAttach---");
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "---onCreate---");
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Log.d(TAG, "---onCreateView---");
TextView tv = new TextView(getActivity());
tv.setGravity(Gravity.CENTER_HORIZONTAL);
tv.setText("測試Fragment");
tv.setTextSize(40);
return tv;
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "---onDestroy---");
}
@Override
public void onDestroyView() {
super.onDestroyView();
Log.d(TAG, "---onDestroyView---");
}
@Override
public void onDetach() {
super.onDetach();
Log.d(TAG, "---onDetach---");
}
@Override
public void onPause() {
super.onPause();
Log.d(TAG, "---onPause---");
}
@Override
public void onResume() {
super.onResume();
Log.d(TAG, "---onResume---");
}
@Override
public void onStart() {
super.onStart();
Log.d(TAG, "---onStart---");
}
@Override
public void onStop() {
super.onStop();
Log.d(TAG, "---onStop---");
}
}
LifecycleFgActivity.java
public class LifecycleFgActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.lifecycle);
LifecycleFragment fragment = new LifecycleFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.life_cycle, fragment).commit();
}
public void bt0(View v) {
Intent intent = new Intent(this, DialogActivity.class);
startActivity(intent);
}
public void bt1(View v) {
LifecycleFragment fragment = new LifecycleFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.life_cycle, fragment);
transaction.addToBackStack(null);
transaction.commit();
}
public void bt2(View v) {
LifecycleFragment fragment = new LifecycleFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.life_cycle, fragment);
transaction.commit();
}
}
lifecycle.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" >
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="bt0"
android:text="打開對話框" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="bt1"
android:text="替換目標(biāo)Fragment吨岭,并加入Back棧" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="bt2"
android:text="退出" />
<FrameLayout
android:id="@+id/life_cycle"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>