为了账号安全,请及时绑定邮箱和手机立即绑定

浅谈FragmentManager与fragment之一二事

标签:
Java Android

图片描述

  • 首先,在讨论彼此关系之前我们先回顾下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方法之前还是之后调用的这一点却是无法保证的哦~
点击查看更多内容
6人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
Web前端工程师
手记
粉丝
42
获赞与收藏
1907

关注作者,订阅最新文章

阅读免费教程

感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消