Fragment的優點:有生命週期的概念、可以作爲View使用
生命週期、使用方式、hide、show、attach、detach、remove、add、replace作用:
我們可以把Fragment當成Activity界面的一個組成部分,甚至Activity的界面可以完全由不同的Fragment組成,而且Fragment擁有自己的生命週期並能進行事件處理,這樣就不必在Activity中寫一堆事件處理邏輯了,更爲重要的是,你可以動態的添加、替換和移除某個Fragment
靜態的使用Fragment:
這是使用Fragment最簡單的一種方式,把Fragment當成普通的控件,直接寫在Activity的佈局文件中:繼承Fragment,重寫onCreateView決定Fragment的佈局、在佈局文件中使用Fragment
動態的使用Fragment:
FragmentManager fm = getFragmentManager(); //Fragment裏面需要調用getChildFragmentManager
FragmentTransaction transaction = fm.beginTransaction();
transaction.commit();
Fragment家族常用API
android.app.Fragment 主要用於定義Fragment
android.app.FragmentManager 主要用於在Activity中操作Fragment
android.app.FragmentTransaction 保證一些列Fragment操作的原子性
FragmentTransaction方法
開啓事務:FragmentTransaction transaction = fm.beginTransatcion();
添加Fragment:transaction.add()
移除Fragment:transaction.remove()
替換Fragment,實際上就是remove()然後add():transaction.replace()
隱藏Fragment,僅僅是設爲不可見,並不會銷燬:transaction.hide()
顯示之前隱藏的Fragment:transaction.show()
銷燬view視圖 ,和remove()不同,此時fragment的狀態依然由FragmentManager維護:detach()
重建view視圖,附加到UI上並顯示:attach()
提交一個事務:transatcion.commit()
switch(msg.what) {
case1:
fragmentTransaction=fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.framelayout,blankFragmentOne);
fragmentTransaction.commit();
break;
case 2:
fragmentTransaction=fragmentManager.beginTransaction();
fragmentTransaction.detach(blankFragmentOne);
fragmentTransaction.commit();
break;
case 3:
fragmentTransaction=fragmentManager.beginTransaction();
fragmentTransaction.attach(blankFragmentOne);
fragmentTransaction.commit();
break;
}
- 09-13 09:46:12.489 26270-26270/com.example.wangzihan.myapplication E/parachute: onAttach 1
- 09-13 09:46:12.489 26270-26270/com.example.wangzihan.myapplication E/parachute: onCreate 1
- 09-13 09:46:12.490 26270-26270/com.example.wangzihan.myapplication E/parachute: onCreateView 1
- 09-13 09:46:12.515 26270-26270/com.example.wangzihan.myapplication E/parachute: onActivityCreated 1
- 09-13 09:46:12.515 26270-26270/com.example.wangzihan.myapplication E/parachute: onStart 1
- 09-13 09:46:12.515 26270-26270/com.example.wangzihan.myapplication E/parachute: onResume 1
- 09-13 09:46:14.488 26270-26270/com.example.wangzihan.myapplication E/parachute: onPause 1
- 09-13 09:46:14.489 26270-26270/com.example.wangzihan.myapplication E/parachute: onStop 1
- 09-13 09:46:14.490 26270-26270/com.example.wangzihan.myapplication E/parachute: onDestroyView 1
- 09-13 09:46:16.490 26270-26270/com.example.wangzihan.myapplication E/parachute: onCreateView 1
- 09-13 09:46:16.495 26270-26270/com.example.wangzihan.myapplication E/parachute: onActivityCreated 1
- 09-13 09:46:16.496 26270-26270/com.example.wangzihan.myapplication E/parachute: onStart 1
- 09-13 09:46:16.496 26270-26270/com.example.wangzihan.myapplication E/parachute: onResume 1
switch(msg.what) {
case1:
fragmentTransaction=fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.framelayout,blankFragmentOne);
fragmentTransaction.commit();
break;
case 2:
fragmentTransaction=fragmentManager.beginTransaction();
fragmentTransaction.remove(blankFragmentOne);
fragmentTransaction.commit();
break;
case 3:
fragmentTransaction=fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.framelayout,blankFragmentOne);
fragmentTransaction.commit();
break;
}
- 09-13 09:48:35.027 28354-28354/com.example.wangzihan.myapplication E/parachute: onAttach 1
- 09-13 09:48:35.027 28354-28354/com.example.wangzihan.myapplication E/parachute: onCreate 1
- 09-13 09:48:35.028 28354-28354/com.example.wangzihan.myapplication E/parachute: onCreateView 1
- 09-13 09:48:35.035 28354-28354/com.example.wangzihan.myapplication E/parachute: onActivityCreated 1
- 09-13 09:48:35.035 28354-28354/com.example.wangzihan.myapplication E/parachute: onStart 1
- 09-13 09:48:35.035 28354-28354/com.example.wangzihan.myapplication E/parachute: onResume 1
- 09-13 09:48:37.027 28354-28354/com.example.wangzihan.myapplication E/parachute: onPause 1
- 09-13 09:48:37.027 28354-28354/com.example.wangzihan.myapplication E/parachute: onStop 1
- 09-13 09:48:37.028 28354-28354/com.example.wangzihan.myapplication E/parachute: onDestroyView 1
- 09-13 09:48:37.030 28354-28354/com.example.wangzihan.myapplication E/parachute: onDestroy 1
- 09-13 09:48:37.031 28354-28354/com.example.wangzihan.myapplication E/parachute: onDetach 1
- 09-13 09:48:39.028 28354-28354/com.example.wangzihan.myapplication E/parachute: onAttach 1
- 09-13 09:48:39.028 28354-28354/com.example.wangzihan.myapplication E/parachute: onCreate 1
- 09-13 09:48:39.028 28354-28354/com.example.wangzihan.myapplication E/parachute: onCreateView 1
- 09-13 09:48:39.040 28354-28354/com.example.wangzihan.myapplication E/parachute: onActivityCreated 1
- 09-13 09:48:39.040 28354-28354/com.example.wangzihan.myapplication E/parachute: onStart 1
- 09-13 09:48:39.040 28354-28354/com.example.wangzihan.myapplication E/parachute: onResume 1
hide和show只會出發onHiddenChanged回調
FragmentTransaction.addToBackStack(String),把Transaction添加到回退棧,這樣按返回鍵時,會執行popBackStack將Transaction從回退棧中移除,並執行Transaction的反向操作,另外,加到回退棧中的remove只是只是執行了detach操作,不會執行onDestory和onDetach
Fragment與Activity通信
因爲所有的Fragment都是依附於Activity的,所以通信起來並不複雜,大概歸納爲:
a、如果你Activity中包含自己管理的Fragment的引用,可以通過引用直接訪問所有的Fragment的public方法
b、如果Activity中未保存任何Fragment的引用,每個Fragment都有一個唯一的TAG或者ID,可以通過getFragmentManager.findFragmentByTag()或者findFragmentById()獲得任何Fragment實例,然後進行操作
c、在Fragment中可以通過getActivity得到當前綁定的Activity的實例,然後進行操作
<fragment
android:id="@+id/aaa"
android:tag="bbb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:name="cn.example.bjwangzihan.myapplication.MyFragment"/>
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.remove(fragment1);
fragmentTransaction.commit();
FragmentTransaction fragmentTransaction2 = fragmentManager.beginTransaction();
fragmentTransaction2.add(fragment1,"bbb");
fragmentTransaction2.commit();
add的時候需要附帶TAG信息,XML文件中可以聲明id和tag信息