使用这个框架的时候,如果要使每一个Fragment都能控制statusbar的颜色等,官方推荐的做法是 BaseFragment extends ImmersionFragment
基类中只考虑了setUserVisibleHint的回调,这个回调只用在viewpager切换fragment时才会回调
然后会重写一个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();
}
}