android.support.v4.app.Fragment和android.app.Fragment区别
android.app.Fragment:①兼容的最低版本是android:minSdkVersion="11"因此你的应用不能兼容3.0以下的应用
②可以使用标签的,这点很重要,如果是用android.support.v4.app.Fragment的话,是不能是用标签的,会抛出android.view.InflateException: Binary XML file line #7: Error inflating class fragment异常
③在activity中取的方法不同:android.app.Fragment使用 (ListFragment)getFragmentManager().findFragmentById(R.id.userList) 获得 ,继承Activity
android.support.v4.app.Fragment:① 兼容的最低版本是android:minSdkVersion="4"可以兼容到1.6的版本,
②不能使用标签,需要在程序中通过add或者replace的方式添加,同时还需要android-support-v4.jar
③在activity中取的方法不同:android.support.v4.app.Fragment使用 (ListFragment)getSupportFragmentManager().findFragmentById(R.id.userList) 获得 ,需要继承android.support.v4.app.FragmentActivity
fragment生命周期函数说明
setUserVisibleHint()
:设置
Fragment
可见或者不可见时会调用此方法。在该方法里面可以通过调用。
getUserVisibleHint()
:获得
Fragment
的状态是可见还是不可见的,如果可见则进行懒加载操作。
onAttach()
:执行该方法时,
Fragment
与
Activity
已经完成绑定,该方法有一个
Activity
类型的参数,
代表绑定的
Activity
,这时候你可以执行诸如
mActivity
=
activity
的操作。
onCreate()
:初始化
Fragment
。可通过参数
savedInstanceState
获取之前保存的值。
onCreateView()
:初始化
Fragment
的布局。加载布局和
findViewById
的操作通常在此函数内完成,但是
不建议执行耗时的操作,比如读取数据库数据列表。
onActivityCreated()
:执行该方法时,与
Fragment
绑定的
Activity
的
onCreate
方法已经执行完成并
返回,在该方法内可以进行与
Activity
交互的
UI
操作,所以在该方法之前
Activity
的
onCreate
方法并未执
行完成,如果提前进行交互操作,会引发空指针异常。
onStart()
:执行该方法时,
Fragment
由不可见变为可见状态。
onResume()
:执行该方法时,
Fragment
处于活动状态,用户可与之交互。
onPause()
:执行该方法时,
Fragment
处于暂停状态,但依然可见,用户不能与之交互。
onSaveInstanceState()
:保存当前
Fragment
的状态。该方法会自动保存
Fragment
的状态,比如
EditText
键入的文本,即使
Fragment
被回收又重新创建,一样能恢复
EditText
之前键入的文本。
onStop()
:执行该方法时,
Fragment
完全不可见。
onDestroyView()
:销毁与
Fragment
有关的视图,但未与
Activity
解除绑定,依然可以通过
onCreateView
方法重新创建视图。通常在
ViewPager+Fragment
的方式下会调用此方法。
onDestroy()
:销毁
Fragment
。通常按
Back
键退出或者
Fragment
被回收时调用此方法。
onDetach()
:解除与
Activity
的绑定。在
onDestroy
方法之后调用。
Fragment
生命周期执行流程(注意红色的不是生命周期方法):
Fragment
创建:
setUserVisibleHint()->onAttach()->onCreate()->onCreateView()-
>onActivityCreated()->onStart()->onResume()
;
Fragment
变为不可见状态(锁屏、回到桌面、被
Activity
完全覆盖):
onPause()-
>onSaveInstanceState()->onStop()
;
Fragment
变为部分可见状态(打开
Dialog
样式的
Activity
):
onPause()-
>onSaveInstanceState()
;
Fragment
由不可见变为活动状态:
onStart()->OnResume()
;
Fragment
由部分可见变为活动状态:
onResume()
;
退出应用:
onPause()->onStop()->onDestroyView()->onDestroy()->onDetach()
(注意退出不会
调用
onSaveInstanceState
方法,因为是人为退出,没有必要再保存数据);
Fragment
被回收又重新创建:被回收执行
onPause()->onSaveInstanceState()->onStop()-
>onDestroyView()->onDestroy()->onDetach()
,重新创建执行
onAttach()->onCreate()-
>onCreateView()->onActivityCreated()->onStart()->onResume()-
>setUserVisibleHint()
;
横竖屏切换:与
Fragment
被回收又重新创建一样。
|
add和replace应用场景
- 当Fragment不可见时,如果你要保留Fragment中的数据以及View的显示状态,那么可以使用add操作,后续针对不同的状态隐藏和显示不同的Fragment。
- 优点:快,支持Fragment中View的显示和隐藏
- 缺点:内存中保留的数据太多,容易导致造成OOM的风险。
- 当Fragment不可见时,你不需要保留Fragment中的数据以及View的显示状态,那么可以使用 replace。
- 优点:节省内存,不需要的数据能立即释放掉
- 缺点:频繁创建Fragment,也就是频繁走Fragment生命周期创建和销毁流程,造成性能开销。
从源码角度描述replace本质就是将replace操作变为remove和add操作,旧的Fragment走生命周期销毁流程,新传递的Fragment走生命周期创建流程。