1. 程式人生 > >fragment之間切換時的生命週期

fragment之間切換時的生命週期

首先,寫一寫關於Fragment生命週期的相關。先放上一張老圖!!

                                                           

Fragment 1 切換到 Fragment 2時生命週期變化

1、通過 add hide show 方式來切換 Fragment

  • Fragment1 的生命週期變化為:onCreate()、onCreateView、onStart()、onResume() 回撥 onHiddenChanged() 方法

  • Fragment2 的生命週期變化為: onCreate()、onCreateView、onStart()、onResume()

  • Fragment 2 再次返回到 Fragment 1:不走任何生命週期方法但是回撥 onHiddenChanged()方法

@Override
    public void onHiddenChanged(boolean hidden) {
        super.onHiddenChanged(hidden);
        if (hidden) {

        } else {
            
        }
    }

boolean的值代表是否隱藏,當切換到當前fragment時hidden為false,切換到別到fragment時hidden為true。

總結:當以這種方式進行 Fragment 1 與 Fragment 2 的切換時,Fragment 隱藏的時候並不走 onDestroyView,所有的顯示也不會走 onCreateView 方法,所有的 view 都會儲存在記憶體

2、使用 replace 的方法進行切換時

  • 載入Fragment 1時:

Fragment 1的生命週期:onCreate()、onCreateView()、onStart()、onResume()

  • 切換到Fragment2時:

Fragment 1的生命週期:onPause()、onStop()、onDestroyView()、onDestroy()

Fragment 2的生命週期:onCreate()、onCreateV()、onStart()、onResume()

  • Fragment 2切換回Fragment 1時:

Fragment2的生命週期:onPause()、onStop()、onDestroyView()、onDestroy()

Fragment 1的生命週期:onCreate()、onCreateV()、onStart()、onResume()

總結:通過 replace 方法進行替換的時,Fragment 都是進行了銷燬,重建的過程,相當於走了一整套的生命週期

3、使用 ViewPager 進行切換時

當使用 ViewPager 與 Fragment 進行切換時,Fragment 會進行預載入操作

所有的 Fragment 都會提前初始--->預載入;

初始化時 Fragment 們的生命週期:

Fragment 1 的生命週期:onCreate()、onCreateView()
Fragment 2 的生命週期:onCreate()、 onCreateView()

Fragment 1 切換到 Fragment 2 的生命週期:

Fragment 1 :不走任何生命週期;
Fragment 2 :走 setUserVisVleHint()方法

切回去也是一樣的

注意: setUserVisVleHint()方法在 Fragment 1 第一次載入的時候不走,只有在切換的時候 走該方法

/**
*第一個 Fragment 需要處理  setUserVisVleHint()方法,設定為 setUserVisibleHint(true);
*否則會產空指標異常,因為 setUserVisVleHint()方法的優先順序高於 onCreate()方法。
*
* @param savedInstanceState
*/
@Override
public void onActivityCreated(Bundle savedInstanceState) {
    setUserVisibleHint(true);
    super.onActivityCreated(savedInstanceState);
}

主動呼叫 setUserVisibleHint()方法來控制第一次不會呼叫setUserVisibleHint方法的問題。
setUserVisibleHint()方法優先onCreateView方法,當onCreateView方法呼叫後還會再次呼叫setUserVisibleHint方法。
此時要對是否呼叫了onCreateView()方法進行標記判斷。

作者:吾乃韓小呆
連結:https://www.jianshu.com/p/c8f34229b6dc
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。

具體載入資料的程式碼

/**
 * 標誌位,標誌已經初始化完成
 */
private boolean isPrepared;



@Override
public void onActivityCreated(Bundle savedInstanceState) {
    // 配置setUserVisibleHint()方法
    setUserVisibleHint(true);
    super.onActivityCreated(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_a, container, false);

    //已經初始化
    isPrepared = true;
    return view;
}

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);

    //可見的並且是初始化之後才載入
    if (isPrepared && isVisibleToUser) {

         getList();

    }
}

作者:吾乃韓小呆
連結:https://www.jianshu.com/p/c8f34229b6dc
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。

Activity 切換到 Fragment 的生命週期變化

Fragment 的生命週期變化為:onStart()、onResume()

從 Fragment 1 進行鎖屏操作

Fragment 的生命週期方法:onPause()、onSaveInstanceState()、onStop()。

從解鎖 到 Fragment 1 的生命週期

onStart()、 onResume()

4.attach和detach切換

方法和show  hide一樣,只是把show改為attach,把hide改為detach

從Fragment 1切換到Fragment 2的時候,

Fragment 1呼叫detach()方法,onPause()->onStop()->onDestroyView();      

Fragment 2 呼叫attach()方法,onCreateView()->onActivityCreated()->onStart()->onResume()