Fragment(最基礎的用法,不涉及到Fragment原理)

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;
}

  1. 09-13 09:46:12.489 26270-26270/com.example.wangzihan.myapplication E/parachute: onAttach 1
  2. 09-13 09:46:12.489 26270-26270/com.example.wangzihan.myapplication E/parachute: onCreate 1
  3. 09-13 09:46:12.490 26270-26270/com.example.wangzihan.myapplication E/parachute: onCreateView 1
  4. 09-13 09:46:12.515 26270-26270/com.example.wangzihan.myapplication E/parachute: onActivityCreated 1
  5. 09-13 09:46:12.515 26270-26270/com.example.wangzihan.myapplication E/parachute: onStart 1
  6. 09-13 09:46:12.515 26270-26270/com.example.wangzihan.myapplication E/parachute: onResume 1
  1. 09-13 09:46:14.488 26270-26270/com.example.wangzihan.myapplication E/parachute: onPause 1
  2. 09-13 09:46:14.489 26270-26270/com.example.wangzihan.myapplication E/parachute: onStop 1
  3. 09-13 09:46:14.490 26270-26270/com.example.wangzihan.myapplication E/parachute: onDestroyView 1
  4.  
  5. 09-13 09:46:16.490 26270-26270/com.example.wangzihan.myapplication E/parachute: onCreateView 1
  6. 09-13 09:46:16.495 26270-26270/com.example.wangzihan.myapplication E/parachute: onActivityCreated 1
  7. 09-13 09:46:16.496 26270-26270/com.example.wangzihan.myapplication E/parachute: onStart 1
  8. 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;
}

  1. 09-13 09:48:35.027 28354-28354/com.example.wangzihan.myapplication E/parachute: onAttach 1
  2. 09-13 09:48:35.027 28354-28354/com.example.wangzihan.myapplication E/parachute: onCreate 1
  3. 09-13 09:48:35.028 28354-28354/com.example.wangzihan.myapplication E/parachute: onCreateView 1
  4. 09-13 09:48:35.035 28354-28354/com.example.wangzihan.myapplication E/parachute: onActivityCreated 1
  5. 09-13 09:48:35.035 28354-28354/com.example.wangzihan.myapplication E/parachute: onStart 1
  6. 09-13 09:48:35.035 28354-28354/com.example.wangzihan.myapplication E/parachute: onResume 1

 

  1. 09-13 09:48:37.027 28354-28354/com.example.wangzihan.myapplication E/parachute: onPause 1
  2. 09-13 09:48:37.027 28354-28354/com.example.wangzihan.myapplication E/parachute: onStop 1
  3. 09-13 09:48:37.028 28354-28354/com.example.wangzihan.myapplication E/parachute: onDestroyView 1
  4. 09-13 09:48:37.030 28354-28354/com.example.wangzihan.myapplication E/parachute: onDestroy 1
  5. 09-13 09:48:37.031 28354-28354/com.example.wangzihan.myapplication E/parachute: onDetach 1

 

  1. 09-13 09:48:39.028 28354-28354/com.example.wangzihan.myapplication E/parachute: onAttach 1
  2. 09-13 09:48:39.028 28354-28354/com.example.wangzihan.myapplication E/parachute: onCreate 1
  3. 09-13 09:48:39.028 28354-28354/com.example.wangzihan.myapplication E/parachute: onCreateView 1
  4. 09-13 09:48:39.040 28354-28354/com.example.wangzihan.myapplication E/parachute: onActivityCreated 1
  5. 09-13 09:48:39.040 28354-28354/com.example.wangzihan.myapplication E/parachute: onStart 1
  6. 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信息

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