Fragment的概念:
- Fragments必须放在一个Activity中
- Fragments可以接收它自己的事件 ---
- 一个Fragment可以放在多个Activity中,一个Activity中也可以放置多个Fragments
- Fragments有它自己的生命周期,而且受到它所在的宿主Activity的生命周期的影响
Fragment的生命周期:
onAttach()
当Fragment与Activity建立关联的时候调用,Activity作为参数传入。
onCreate()
创建Fragment的时候系统会调用此函数。
onCreateView()
创建Fragment的UI. 这个方法必须返回一个View。 表示这个Fragment的根布局。
onActivityCreated()
当Activity的onCreate()方法返回时调用。
onStart()
当Fragment第一次绘制它的UI的时候调用。
onResume()
当Fragment可见且可交互时调用。
onPause()
当用户离开当前Fragment时调用这个方法。 通常用来保存持久化数据。
onStop()
当Fragment不可见时调用。可能情况:activity被stopped或fragment被移除,加入到回退栈。一个stopped的fragment任然是活着的,如果长时间不用也会被移除。
onDestroyView()
当Fragment的UI被删除的时候调用。
onDestory()
当Fragment销毁时调用
onDetach()
当Fragment与Activity取消关联的时候调用。
一个Fragment可以处于3种状态:
运行状态 1. Fragment在当前运行的Activity中可见。
暂停状态 1. 另一个Activity在前台,具有焦点,但是Fragment所在的Activity依然可见。
停止状态 1. Fragment不可见。宿主Activity处于停止状态或者Fragment已经从Activity删除并添加到后台栈中。
Fragment的宿主Activity的生命周期直接影响Fragment的生命周期。因此,Activity的每个生命周期回调函数都会调用对应的Fragment的回调函数。例如,当宿主Activity的onPause()方法被调用的时候,Fragment的onPause()方法也会被调用。
Activity 与 Fragment 生命周期对比:
Fragment 懒加载:
自定义一个 LazyLoadFragment 基类,利用 setUserVisibleHint 和 生命周期方法,通过对 Fragment状态判断,进行数据加载,并将数据加载的接口提供开放出去,供子类使用。然后在子类 Fragment 中实现 requestData 方法即可。这里添加了一个 isDataLoaded 变量,目的是避免重复加载数据。考虑到有时候需要刷新数据的问题,便提供了一个用于强制刷新的参数判断。
public abstract class LazyLoadFragment extends BaseFragment {protected boolean isViewInitiated; protected boolean isDataLoaded; @Override public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); } @Override public void onActivityCreated(Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState); isViewInitiated = true; prepareRequestData(); } @Override public void setUserVisibleHint(boolean isVisibleToUser) {super.setUserVisibleHint(isVisibleToUser); prepareRequestData(); } public abstract void requestData(); public boolean prepareRequestData() { return prepareRequestData(false); } public boolean prepareRequestData(boolean forceUpdate) { if (getUserVisibleHint() && isViewInitiated && (!isDataLoaded || forceUpdate)) { requestData(); isDataLoaded = true; return true; } return false; } }
Fragment状态保存:
Fragment状态保存入口:
- 1、Activity的状态保存, 在Activity的onSaveInstanceState()里, 调用了FragmentManger的 saveAllState()方法, 其中会对mActive中各个Fragment的实例状态和View状态分别进行保存.
- FragmentManager还提供了public方法: saveFragmentInstanceState(), 可以对单Fragment进行状态保存, 这是提供给我们用的。
- FragmentManager的moveToState()方法中, 当状态回退到ACTIVITY_CREATED, 会调用saveFragmentViewState()方法, 保存View的状态
Fragment 在 ViewPager 里面的生命周期,滑动 ViewPager 的页面时 Fragment 的生命周期的变化。 Fragment生命周期:
当fragment被创建的时候,它会经历以下状态: 1. onAttach() 2. onCreate() 3. onCreateView() 4. onActivityCreated()
当fragment对用户可见的时候,它会经历以下状态:1. onStart() 2. onResume()
当fragment不可见的时候,它会经历以下状态:1. onPause()2. onStop()
当fragment被销毁了(或者持有它的activity被销毁了),它会经历以下状态:1. onPause()2. onStop()3. onDestroyView()4. onDetach()
————————————————
版权声明:本文为CSDN博主 CongPong 的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/CongPong/article/details/125891899
版权归原作者 Cong Pong 所有, 如有侵权,请联系我们删除。