Fragment
-
Fragment的概念
fragment是常用的组件之一。与activity相似,用于与用户交互的界面。比activity更加轻量级,更加灵活。依赖于activity,fragment的生命周期受activity的生命周期影响。 -
Fragment的生命周期
onAttach():当Fragment与Activity关联时调用,可以通过该方法获取Activity的引用。
onCreate():当Fragment被创建时调用,可以在该方法中进行一些初始化操作。
onCreateView():当Fragment的UI被创建时调用,可以在该方法中返回Fragment的布局。
onActivityCreated():当Fragment所在的Activity完成创建时调用,可以在该方法中进行一些与Activity相关的操作。
onStart():当Fragment可见时调用,可以在该方法中开始一些动画或者启动一些线程。
onResume():当Fragment获取焦点时调用,可以在该方法中开始一些用户交互操作。
onPause():当Fragment失去焦点时调用,可以在该方法中停止一些用户交互操作。
onStop():当Fragment不可见时调用,可以在该方法中停止一些动画或者线程。
onDestroyView():当Fragment的UI被销毁时调用,可以在该方法中释放一些资源。
onDestroy():当Fragment被销毁时调用,可以在该方法中释放一些资源。
onDetach():当Fragment与Activity解除关联时调用,可以在该方法中释放Activity的引用。
-
Fragment回退栈
通过addToBackStack()方法将fragment添加进栈,如果你将Fragment任务添加到回退栈,当用户点击后退按键时,将看到上次保存的Fragment。一旦Fragment完全从回退栈中弹出,用户再次点击后退键,则退出当前Activity。
1、当不添加回退栈时的生命周期:
A跳转到B时A执行: onPause() -> onStop() -> onDestroyView() -> onDestroy() -> onDetach()
再切换回A时: onAttach() -> onCreate() -> onCreateView() -> onActivityCreated() -> onStart() -> onResume()
按home键回到主页: onPause() -> onStop()
主页返回A: onStart() -> onResume()
2、当添加到回退栈时的生命周期:
A跳转到B时A执行: onPause() -> onStop() -> onDestroyView()
再切换回A时: onCreateView() -> onActivityCreated() -> onStart() -> onResume()
按home键回到主页: 无
主页返回A: 无 -
动态添加Fragment步骤
(1)创建Fragment实例
(2)获取FragmentManager,可以通过getSupportFragmentMannager()方法得到
(3)调用beginTransaction()方法开启一个事务
(4)向容器内add()或replace()Fragment
(5)调用commit()方法提交事务
Fragment fragment = new Fragment();
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.layout.fragment,fragment);
ft.commit(); -
Fragment为什么有的时候会重叠,怎么产生的,又如何解决?
1)发生了页面重启(旋转屏幕、内存不足等情况被强杀重启):
系统在页面重启前,帮我们保存了Fragment的状态,但是在重启后恢复时,视图的可见状态没帮我们保存,而Fragment默认的是show状态,所以产生了Fragment重叠现象。
2)重复replace|add Fragment 或者 使用show,hide控制Fragment:
我们会在Activity的onCreate()里或者Fragment的onCreateView()里加载根Fragment,如在这里没有进行页面重启的判断的话,就可能导致重复加载Fragment引起重叠;在使用replace加载Fragment时,页面重启后,Fragment视图都还没创建,所以mHidden没有意义,不会发生重叠现象;而在使用add加载时,视图是存在的并且叠加在一起,页面重启后 mHidden=false,所有的Fragment都会是show状态显示出来(即VISIBLE),从而造成了Fragment重叠!