安卓Fragment(一)

由于公司最近的项目里面广告播放要用两种模式视频广告和图片广告,这里就涉及到切换问题,Activity很难实现所以我准备用Fragment。这篇文章先简单介绍下这儿类。

一.什么是Fragment

Android运行在各种各样的设备中,有小屏幕的手机,超大屏的平板甚至电视。针对屏幕尺寸的差距,很多情况下,都是先针对手机开发一套App,然后拷贝一份,修改布局以适应平板神马超级大屏的。难道无法做到一个App可以同时适应手机和平板么,当然了,必须有啊。Fragment的出现就是为了解决这样的问题。你可以把Fragment当成Activity的一个界面的一个组成部分,甚至Activity的界面可以完全有不同的Fragment组成,更帅气的是Fragment拥有自己的生命周期和接收、处理用户的事件,这样就不必在Activity写一堆控件的事件处理的代码了。更为重要的是,你可以动态的添加、替换和移除某个Fragment。

二.Fragment生命周期

Fragment必须是依存与Activity而存在的,因此Activity的生命周期会直接影响到Fragment的生命周期。

下面是fragment生命周期图和与Activity对比的图:

 

 

onAttach(Activity)
FragmentActivity发生关联时调用。
onCreateView(LayoutInflater, ViewGroup,Bundle)
创建该Fragment的视图
onActivityCreated(Bundle)
ActivityonCreate方法调用时调用
onDestoryView()
onCreateView想对应,当该Fragment的视图被移除时调用
onDetach()
onAttach相对应,当FragmentActivity关联被取消时调用

 

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);

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值