新东西011--Android Fragment常见错误分析

来源:互联网 发布:杜冷丁多少钱一支淘宝 编辑:程序博客网 时间:2024/05/29 18:22

       Fragment的onResume和onHiddenChanged差异解析

             OnHiddenChanged:它是onResume的辅助工具,它在第一次进入Fragment和销毁Fragment的时候不会调用。这也意味着使用replace方法切换Fragment的时候它不会得到调用(因为使用replace(id,fragmentB)切换的时候,目标fragmentB会重建,会重走FramentB的生命周期)。但在同一个Activity下通过hide/show方法切换Fragment的时候就会触发这个方法。通过一个boolean hidden的参数,对同一Activity下的Fragment隐藏显示变化做区分。

            OnResume:跟activity生命周期相似,在new Fragment,并将该Fragmentd加载到界面的时候,重走Fragment的生命周期函数,onCreateView-onresume(只列举部分)。同时,它也跟activity的生命周期相关,比如ActivityA下有一个FragmentA,当从ActivityA跳转到ActivityB,然后从ActivityB返回ActivityA的时候,会调用FragmentA的onResume方法。这也说明Fragment的onResume是依赖于Activity的onResume存在的,只要这个Fragment对象不变(因为一新建就会走自己的生命周期函数,自然会走onResume),那么只有当Activity调用onResume的时候才会调用其下Fragment的onResume方法。

           这里也顺便提一下,“onResume只会调用一次的问题”,有很多朋友在开发过程中复用Fragment,使用hiden/show切换Fragment,同时又没有切换Activity显示,那么除了第一次走Fragment周期函数的时候会调用onResume,其余都不会调用,因为Fragment对象不变,Activity也没有调用onResume方法。

Fragment的commit()方法和cmmitAllowingStateLose()的区别

在说这个之前需要普及一点Activity的onSaveInstanceState的调用时机,onSaveInstanceState调用时机是指当前activity在当前activety队列的最上层的时候,这个时候旋转屏幕肯定会引起onSaveInstanceState的调用。其次,在显示在最上层的情况下,用户按下Home键或者切换应用,切换activity的时候都会引起onsaveInstance的调用。

cmmitAllowingStateLose:在Activity的onSaveInstanceState之后调用增减Fragment的操作并commit会出现IllegalStateException错误,原因是因为Activity的commit方法一定要在onSaveInstancestate方法之前调用。如果要在之后调用就要使用commitAllowingStateLose来确保使用。

0 0
原创粉丝点击