Android Fragment的详解

Fragment的介绍
为了让界面可以在平板上更好地展示,Android在3.0版本引入了Fragment(碎片)功能,它非常类似于Activity,可以像Activity一样包含布局。Fragment通常是嵌套在Activity中使用的,现在想象这种场景:有两个Fragment,Fragment 1包含了一个ListView,每行显示新闻的标题。Fragment 2包含了TextView和ImageView,来显示新闻的详细内容和图片。
如果现在程序运行竖屏模式的平板或手机上,Fragment 1可能嵌入在一个Activity中,而Fragment 2可能嵌入在另一个Activity中,如下图所示:

Fragment1

而如果现在程序运行在横屏模式的平板上,两个Fragment就可以嵌入在同一个Activity中了,如下图所示:
Fragment2

由此可见,Fragment(碎片)是一种可以嵌入Activity(活动)当中的UI片段,它能让程序更加合理地利用大屏幕的空间。

Fragment的生命周期
和Activity一样,Fragment也有自己的生命周期,并且它和Activity的生命周期 非常像。
Fragment的状态和回调
每个Activity在其生命周期内主要有四种状态,运行状态、暂停状态、停止状态和销毁状态。类似的,Fragment在其生命周期内也可能会经历这几种状态,只不过在一些细小的地方有部分区别
1. 运行状态
当一个Fragment是可见的,并且它所关联的Activity正处于运行状态时,该Fragment也处于运行状态。
2. 暂停状态
当一个Activity进入暂停状态时(由于另一个未占满屏幕的Activity被添加到了栈顶),与它相关联的可见Fragment就会进入暂停状态。
3. 停止状态
当一个Activity进入停止状态时,与它关联的Fragment就会进入到停止状态。或者通过调用FragmentTransaction的remove()、replace()方法将Fragment从Activity中移除,但有在事务提交之前调用addToBackStack()方法,这时Fragment也会进入到停止状态。总的来说,进入停止状态的Fragment对用户来说是完全不可见的,有可能会被系统回收。
4. 销毁状态
Fragment总是依附于Activity而存在的,因此Activity被销毁时,与它相关联的Fragment就会进入到销毁状态。或者通过调用FragmentTransaction的remove()、replace()方法将Fragment从Activity中移除,但在事务提交之前并没有调用addToBackStack()方法,这时的Fragment也会进入到销毁状态。

同样地,Fragment类中也提供了一系列的回调方法,以覆盖Fragment生命周期的每一个环节。其中,Activity中有的回调方法,Fragment中几乎都有,不过Fragment还提供了一些附加的回调方法。这些回调的方法如下:
1. onAttach()
当Fragment和Activity建立关联的时候调用。
2. onCreateView()
为Fragment创建视图(加载布局)时调用。
3. onActivityCreated()
确保与Fragment相关联的Activity一定已经创建完毕的时候调用。
4. onDestroyView()
当与Fragment关联的视图被移除的时候调用。
5. onDetach()
当Fragment和Activity解除关联的时候调用

Fragment完整的生命周期示意图可参考下图:

Fragment的完整生命周期图
Fragment的完整生命周期图

Fragment和Activity之间进行通信
为了方便Fragment和Activity之间进行通信,FragmentManager提供了一个类似于findViewById()的方法,专门用于从布局文件中获取Fragment的实例,代码如下:

Fragment1 fragment1 = (Fragment1) getFragmentManager().findFragmentById(R.id.fragment1);

调用FragmentManager的findFragmentById()方法,可以在活动中得到相应Fragment的实例,然后就能轻松地调用Fragment里的方法了。

掌握了如何在Activity中调用活动里的方法,那在Fragment中有该如何调用Activity里的方法呢?其实这就更简单了,在每个碎片中都可以通过调用getActivity()方法来得到和当前Fragment相关联的Activity实例,代码如下:

MainActivity activity = (MainActivity)getActivity();

有了Activity实例之后,在碎片中调用Activity中的方法就变得轻而易举了。另外当Fragment中需要使用Context对象时,也可以使用getActivity()方法,因为获取到的活动本身就是一个Context对象。

那Fragment和Fragment之间如何通信呢?其实思路很简单,首先在一个Fragment中可以得到与它相关联的Activity,然后通过这个Activity去获取另外一个Fragment的实例,这样也就实现了不同Fragment之间的通信功能。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值