安卓Fragment(一)
由于公司最近的项目里面广告播放要用两种模式视频广告和图片广告,这里就涉及到切换问题,Activity很难时间所以我准备用Fragment。这篇文章先简单介绍下这儿类。
一.什么是Fragment
Android运行在各种各样的设备中,有小屏幕的手机,超大屏的平板甚至电视。针对屏幕尺寸的差距,很多情况下,都是先针对手机开发一套App,然后拷贝一份,修改布局以适应平板神马超级大屏的。难道无法做到一个App可以同时适应手机和平板么,当然了,必须有啊。Fragment的出现就是为了解决这样的问题。你可以把Fragment当成Activity的一个界面的一个组成部分,甚至Activity的界面可以完全有不同的Fragment组成,更帅气的是Fragment拥有自己的生命周期和接收、处理用户的事件,这样就不必在Activity写一堆控件的事件处理的代码了。更为重要的是,你可以动态的添加、替换和移除某个Fragment。
二.Fragment生命周期
Fragment必须是依存与Activity而存在的,因此Activity的生命周期会直接影响到Fragment的生命周期。
下面是fragment生命周期图和与Activity对比的图:
onAttach(Activity)
当Fragment与Activity发生关联时调用。
onCreateView(LayoutInflater, ViewGroup,Bundle)
创建该Fragment的视图
onActivityCreated(Bundle)
当Activity的onCreate方法调用时调用
onDestoryView()
与onCreateView想对应,当该Fragment的视图被移除时调用
onDetach()
与onAttach相对应,当Fragment与Activity关联被取消时调用
Fragment生命周期测试
onCreate过程
01-22 15:30:28.091: E/HJJ(10315): Activity &&&& onCreate…
01-22 15:30:28.091: E/HJJ(10315): ArrayListFragment ** onAttach…
01-22 15:30:28.091: E/HJJ(10315): ArrayListFragment ** onCreate…
01-22 15:30:28.115: E/HJJ(10315): ArrayListFragment ** onCreateView…
01-22 15:30:28.123: E/HJJ(10315): ArrayListFragment ** onActivityCreated…
onStart过程
01-22 15:30:28.123: E/HJJ(10315): Activity &&&& onStart…
01-22 15:30:28.123: E/HJJ(10315): ArrayListFragment ** onStart…
onResume过程
01-22 15:30:28.123: E/HJJ(10315): Activity &&&& onResume…
01-22 15:30:28.123: E/HJJ(10315): ArrayListFragment ** onResume…
onPause过程
01-22 15:31:26.748: E/HJJ(10315): ArrayListFragment ** onPause…
01-22 15:31:26.748: E/HJJ(10315): Activity &&&& onPause…
onStop过程
01-22 15:31:27.638: E/HJJ(10315): ArrayListFragment ** onStop…
01-22 15:31:27.638: E/HJJ(10315): Activity &&&& onStop…
onStart过程
01-22 15:31:57.537: E/HJJ(10315): Activity &&&& onStart…
01-22 15:31:57.537: E/HJJ(10315): ArrayListFragment ** onStart…
onResume过程
01-22 15:31:57.537: E/HJJ(10315): Activity &&&& onResume…
01-22 15:31:57.537: E/HJJ(10315): ArrayListFragment ** onResume…
onPause过程
01-22 15:32:47.412: E/HJJ(10315): ArrayListFragment ** onPause…
01-22 15:32:47.412: E/HJJ(10315): Activity &&&& onPause…
onStop过程
01-22 15:32:47.865: E/HJJ(10315): ArrayListFragment ** onStop…
01-22 15:32:47.865: E/HJJ(10315): Activity &&&& onStop…
onDestroy过程
01-22 15:32:47.865: E/HJJ(10315): ArrayListFragment ** onDestroyView…
01-22 15:32:47.865: E/HJJ(10315): ArrayListFragment ** onDestroy…
01-22 15:32:47.865: E/HJJ(10315): ArrayListFragment ** onDetach…
01-22 15:32:47.865: E/HJJ(10315): Activity &&&& onDestroy…
场景演示 : 切换到该Fragment
11-29 14:26:35.095: D/AppListFragment(7649): onAttach
11-29 14:26:35.095: D/AppListFragment(7649): onCreate
11-29 14:26:35.095: D/AppListFragment(7649): onCreateView
11-29 14:26:35.100: D/AppListFragment(7649): onActivityCreated
11-29 14:26:35.120: D/AppListFragment(7649): onStart
11-29 14:26:35.120: D/AppListFragment(7649): onResume
屏幕灭掉:
11-29 14:27:35.185: D/AppListFragment(7649): onPause
11-29 14:27:35.205: D/AppListFragment(7649): onSaveInstanceState
11-29 14:27:35.205: D/AppListFragment(7649): onStop
屏幕解锁
11-29 14:33:13.240: D/AppListFragment(7649): onStart
11-29 14:33:13.275: D/AppListFragment(7649): onResume
切换到其他Fragment:
11-29 14:33:33.655: D/AppListFragment(7649): onPause
11-29 14:33:33.655: D/AppListFragment(7649): onStop
11-29 14:33:33.660: D/AppListFragment(7649): onDestroyView
切换回本身的Fragment:
11-29 14:33:55.820: D/AppListFragment(7649): onCreateView
11-29 14:33:55.825: D/AppListFragment(7649): onActivityCreated
11-29 14:33:55.825: D/AppListFragment(7649): onStart
11-29 14:33:55.825: D/AppListFragment(7649): onResume
回到桌面
11-29 14:34:26.590: D/AppListFragment(7649): onPause
11-29 14:34:26.880: D/AppListFragment(7649): onSaveInstanceState
11-29 14:34:26.880: D/AppListFragment(7649): onStop
回到应用
11-29 14:36:51.940: D/AppListFragment(7649): onStart
11-29 14:36:51.940: D/AppListFragment(7649): onResume
退出应用
11-29 14:37:03.020: D/AppListFragment(7649): onPause
11-29 14:37:03.155: D/AppListFragment(7649): onStop
11-29 14:37:03.155: D/AppListFragment(7649): onDestroyView
11-29 14:37:03.165: D/AppListFragment(7649): onDestroy
11-29 14:37:03.165: D/AppListFragment(7649): onDetach
三.FragmentTransaction事务回滚使用方法
从 FragmentManager获得一个FragmentTransaction的实例:
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
每一个事务都是同时要执行的一套变化.可以在一个给定的事务中设置你想执行的所有变化,使用诸如add(), remove(), 和replace().然后,要给activity应用事务,必须调用commit().在调用commit()之前,你可能想调用addToBackStack(),将事务添加到一个fragment事务的back stack. 这个back stack由activity管理,并允许用户通过按下BACK按键返回到前一个fragment状态。
transaction.add()
往Activity中添加一个Fragment
transaction.remove()
从Activity中移除一个Fragment,如果被移除的Fragment没有添加到回退栈(回退栈后面会详细说),这个Fragment实例将会被销毁。
transaction.replace()
使用另一个Fragment替换当前的,实际上就是remove()然后add()的合体~
transaction.hide()
隐藏当前的Fragment,仅仅是设为不可见,并不会销毁
transaction.show()
显示之前隐藏的Fragment
detach()
会将view从UI中移除,和remove()不同,此时fragment的状态依然由FragmentManager维护。
attach()
重建view视图,附加到UI上并显示。
要使用回滚功能,只需要要使用下面两个代码:
在transaction.commit()之前,使用addToBackStack()将其添加到回退栈中。
transaction.addToBackStack(String tag);
在需要回退时,使用popBackStack()将最上层的操作弹出回退栈。
manager.popBackStack();
这里的popBackStack()是弹出默认的最上层的栈顶内容。
当栈中有多层时,我们可以根据id或TAG标识来指定弹出到的操作所在层。
函数如下:
void popBackStack(int id, int flags);
void popBackStack(String name, int flags);
其中
参数int id是当提交变更时transaction.commit()的返回值。
参数string name是transaction.addToBackStack(String tag)中的tag值;
至于int flags有两个取值:
0或FragmentManager.POP_BACK_STACK_INCLUSIVE;
当取值0时,表示除了参数一指定这一层之上的所有层都退出栈,
指定的这一层为栈顶层;
当取值POP_BACK_STACK_INCLUSIVE时,
表示连着参数一指定的这一层一起退出栈;
//获取回退栈中,Transaction回退操作的数量
public int getBackStackEntryCount();
//根据索引得到回退栈变量
public BackStackEntry getBackStackEntryAt(int index);