Fragment和Activity的关系

1、Fragment引入


fragment是一种控制器对象,activity可委派它完成一个任务。通常这些任务就是管理用户界面。受管的用户界面可以是一整屏或者是整屏的一部分。

2、Fragment与支持库


Fragment被引入到API 11级中,为了保证先后兼容性问题,谷歌提供了支持库(libs/android-support-v4.jar)给开发者使用,该类库可以使用在任何API 4级及更高版本的设备上。


另一个重要的支持库类是FragmentActivity(android.support.v4.app.FragmentActivity)。Activity知道如何管理fragment,因此fragment的使用需要activity的支持。在Honeycomb(Android3.0)及后续的Android版本中,Activity的所有子类都知道如何管理fragment。而这之前版本的Activity则完全不了解fragment,Activity的所有子类自然也就无从知晓。为兼容较低版本的设备,可继承FragmentActivity类。FragmentActivity是Activity的子类,具有管理fragment的能力。


3、托管UI Fragment


为托管UI fragment,activity必须做到:

a.在布局中为fragment的试图安排位置;

b.管理fragment实例的生命周期。


4、fragment的生命周期


生命周期方法的对应非常重要。因为fragment代表activity在工作,它的状态应该反映了activity的状态。因而fragment需要对应的生命周期方法来处理activity的工作。


fragment生命周期与activity生命周期的一个关键区别在于:fragment的生命周期方法是由托管activity而不是操作系统调用的。操作系统无从知晓activity用来管理试图的fragment。fragment的使用是activity自己内部的事情。


下图为fragment的生命周期图:

下图是对fragment生命周期的图解:

注意:

首先,Fragment.onCreate(Bundle)是公共方法,而Activity.onCreate(Bundle)是保护方法。因为需要被托管fragment的任何activity调用,因此Fragment.onCreate(...)方法及其他Fragment生命周期方法必须设计为公共方法。


其次,类似于activity,fragment同样具有保存及获取状态的bundle.如果使用Activity.onSaveInstanceState(Bundle)方法那样,我们也可以根据需要覆盖fragment.onSaveInstanceState(Bundle)方法


最后注意,在fragment.onCreate(...)方法中,并没有生成fragment的试图。虽然在Fragment.onCreate(...)方法中配置了fragment实例,但创建和配置fragment视图是通过连一个fragment生命周期方法来完成的onCreateView(LayoutInflater,ViewGroup,Bundle)。

通过该方法生成fragment视图的布局,然后将生成的View返回给托管activity.LayoutInflater及ViewGroup是用来生成布局的必要参数。Bundle中包含了供该方法在保存状态下重建视图所需要的数据。


5、添加UI Fragment到FragmentManager

Fragment类引入到Honeycomb时,为协同工作,Activity类被更改为含有FragmentManager类。FragmentManager类负责管理fragment并将它们的视图添加到activity的视图层级结构中。


FragmentManager具体管理的是:

a.fragment队列

b.fragment事务的回退栈


FragmentManager.beginTransaction()方法创建并返回FragmentTransaction实例。FragmentTransaction类使用了一个fluent interface接口方法,通过该方法配置FragmentTransaction返回FragmentTransaction类对象,而不是void。

add(...)方法是整个事务的核心部分,并含有两个参数,及容器视图资源ID和新创建的fragment对象。容器视图资源ID主要有两点作用:
告知FragmentManager fragment视图应该出现在activity视图的什么地方
是FragmentManager队列中fragment的唯一标识符

6、FragmentManager与fragment生命周期


activity的FragmentManager负责调用队列中fragment的生命周期方法。添加fragment供FragmentManager管理时,onAttach(Activity)、onCreate(Bundle)以及onCreateView(...)方法会被调用。

在activity处于停止、暂停或运行状态下,添加fragment会发生什么呢?此种情况下,FragmentManager立即驱使fragment快速跟上activity的步伐,直到与最新状态保持同步。

只有frament的状态与activity的状态保持了同步,托管activity的FragmentManager便会继续调用其他生命周期方法以继续保持fragmen与activity的状态一致,而几乎就在同时,它接收到了从操作系统发出的相应调用。但fragment方法究竟是在activity方法之前还是之后调用的这一点是无法保证的。

如使用了支持库,fragment生命周期的其他方法被调用的顺序则略有不同。如在Activity.onCreate(...)方法中添加fragment,那么onActivityCreated(...)方法是在Activity.onStart()方法执行后被调用的,而不是紧随Activity.onCreate方法之后被调用。为什么会这样?在Honeycomb以前的版本中,立即从FragmentActivity中调用onActivityCreated(...)方法是不可能的。因此,下一个生命周期方法一执行,它才会被调用。在实际开发中,二者通常没什么区别;onStart()方法会紧随Activity.onCreate(...)方法之后被调用。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值