- 首先,在讨论彼此关系之前我们先回顾下fragment的生命周期,尽管它看起来跟我们熟知的activity很相似,一个关键的区别在于fragment的生命周期方法是由托管activity而不是操作系统调用的,因为操作系统无法得知Activity用来管理视图的fragment,fragment的使用是在Activity它自己内部处理。
- FragmentManager是负责管理fragment并将它们的视图添加到activity的视图层级结构中,考虑到Honeycomb以前版本的兼容性问题,这里使用支持库类
FragmentActivity(android.support.v4.app.Fragment.Activity)
,通过继承FragmentActivity类,调用getSupportFragmentManager()
获取FragmentManager。
注意⚠️:在Honeycomb及后续的Android版本中,Activity的所有子类都知道如何管理fragment,我们可以直接使用标准库种的原生fragment类。如果大家觉得自己是为最新版本设备开发应用的话就没必要使用支持库,但代码需要有如下修改:
1.放弃使用FragmentActivity
类,转而使用标准库中的Activity
(android.app.Activity)-->activity默认支持API在11以上版本中的fragment;
2.放弃使用android.support.v4.app.Fragment
类,转而使用android.app.Fragment
类;
3.放弃使用getSupportFragmentManager()
方法获取FragmentManager,转而使用getFragmentManager()
方法。
public class CrimeActivity extends FragmentActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_crime);
FragmentManager manager = getSupportFragmentManager();
Fragment fragment = manager.findFragmentById(R.id.fragmentContainer);
if (fragment == null) {
fragment = new CrimeFragment();
manager.beginTransaction()
.add(R.id.fragmentContainer, fragment)
.commit();
}
}
-
唠叨了这么多,我们以一段代码为例子开始进入正题吧,activity的FragmentManager负责调用队列中fragment的生命周期方法。添加fragment供FragmentManager管理时,onAttach(Activity)、onCreate(Bundle)以及onCreateView(...)方法会被调用。托管activity的onCreate(...)方法执行后,onActivityCreated(...)方法也会被调用。因为我们正向CrimeActivity.onCreate(...)方法添加CrimeFragment,所以fragment被添加后,该方法会被调用。
-
在activity处于停止,暂停或运行状态下时,添加fragment会发生什么呢?此种情况下,FragmentManager立即驱使fragment快速跟上activity的步伐,直到与activity的最新状态保持同步。例如,向处于运行状态的activity中添加fragment时,以下fragment生命周期方法会被依次调用:onAttach(Activity)、onCreate(Bundle)、onCreateView(...)、onActivityCreated(Bundle)、onStart(),以及onResume()方法。
- 只要fragment的状态与activity的状态保持了同步,托管activity的FragmentManager便会继续调用其他生命周期方法以继续保持fragment与activity的状态一致,而几乎就在同时,它接受到了从操作系统发出的相应调用。但fragment方法究竟是在activity方法之前还是之后调用的这一点却是无法保证的哦~
热门评论
我有个问题想请教下,关于最新版本中使用android.app.Fragment类 代替 android.support.v4.app.Fragment类,在使用FragmentPagerAdapter时,该类是在android.support.v4.app包中的,所以覆写后方法中的Fragment都是android.support.v4.app.Fragment类型而不是android.app.Fragment,这种情况怎么办?
如:
private class mViewPagerFragmentAdapter extends FragmentPagerAdapter {
public mViewPagerFragmentAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
return null;
}
@Override
public int getCount() {
return 0;
}
}
这个是摘录下来的吧