关于ImmersionBar的immersionInit回调问题

来源:互联网 发布:希腊语词根知乎 编辑:程序博客网 时间:2024/06/07 13:58
使用这个框架的时候,如果要使每一个Fragment都能控制statusbar的颜色等,官方推荐的做法是 BaseFragment extends ImmersionFragment

然后会重写一个immersionInit方法,在里面去做状态栏颜色的改变等. 

但是这个方法的回调,只有在使用viewpager加载fragment的时候,才会在切换时回调,达到改变的目的.

如果是通过add show hide 方法切换fragment的话,这个方法是不会回调的! 意味着,一旦切换fragment,再切换回来时,状态栏不会变成原来的样子!

这是为什么呢!!!!

通过查看ImmersionFragment的源码

@Override    public void setUserVisibleHint(boolean isVisibleToUser) {        super.setUserVisibleHint(isVisibleToUser);        if ((isVisibleToUser && isResumed())) {            onResume();        }    }    @Override    public void onResume() {        super.onResume();        if (getUserVisibleHint() && immersionEnabled()) {            immersionInit();        }    }

基类中只考虑了setUserVisibleHint的回调,这个回调只用在viewpager切换fragment时才会回调

而没有考虑onHiddenChanged,onHiddenChanged在使用hide时被激发,后面show/hide时会回调

上面的代码也很清晰的表现出为何使用add hide show方法切换时,只回调一次immersionInit方法

因为第一次add时,才会走onResume方法,以后的show和hide 都不会走onResume了更不会走setUserVisibleHint,因此immersionInit只回调一次!

而使用viewpager切换fragment时,onResume每次都会调用,因此,当调用onResume并此fragment可见时,就会去调用immersionInit!


解决方法
如何解决add hide show 只调用一次immersionInit的问题呢?
在BaseFragment中重写onHiddenChanged,让其在可见时调用immersionInit就可以了

@Override    public void onHiddenChanged(boolean hidden) {        super.onHiddenChanged(hidden);        if (!hidden) {            immersionInit();        }    }



原创粉丝点击