工作中需要用到懒加载的地方可能有很多,比如ViewPager+Fragment的使用时,要求不同的Fragment的状态栏颜色不一样,这样就需要动态修改状态栏的颜色。
因为viewpager是有最小缓存的,所以直接在fragment里写修改每个fragment的状态栏颜色是不会起作用的。因为缓存的作用,代码已经提前执行了。所以必须用Fragment懒加载,当gragment可见时去修改状态栏的颜色,这样只是修改当前的Fragment的,不会影响其他fragment。
先说一下,修改状态栏颜色
网上有很多解决方法,Github上也有不少开源库,比如StatusBarUtil和ImmersionBar,自己选择其中一种方案即可
Fragment懒加载的实现
先贴代码
参考博客ViewPager+Fragment 取消 (禁止) 预加载延迟加载 (懒加载) 问题解决方案
package com.yunduo.wisdom.base;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.IdRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.yunduo.wisdom.util.eventbus.EventBusUtil;
import butterknife.ButterKnife;
import butterknife.Unbinder;
import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
/**
* Created by parade岁月 on 2019/8/16 0:04
*/
public abstract class BaseFragment extends Fragment {
private View mRootView;
protected Context mContext;
private Unbinder unbinder;
//视图是否已经完成初始化
private boolean isViewCreated;
//是否已经预加载过数据
private boolean isLoad;
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (mContext != null){
mContext = context;
}
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
if (mRootView == null){
mRootView = inflater.inflate(getLayoutId(), container, false);
}
unbinder = ButterKnife.bind(this, mRootView);
if (isRegisteredEventBus()){
EventBusUtil.register(this);
}
initViews();
initDatas();
setEvents();
return mRootView;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
isViewCreated = true;
isCanLoadData();
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
isCanLoadData();
}
private void isCanLoadData() {
if (!isViewCreated){
return;
}
if (getUserVisibleHint()){
lazyLoad();
isLoad = true;
}
}
/**
* 设置布局
* @return fragment的布局资源
*/
protected abstract int getLayoutId();
/**
* 此方法内进行布局绑定、View初始化等操作
*/
protected abstract void initViews();
/**
*在布局加载后执行(有可能布局还不可见),建议在此方法内加载数据和处理布局显示数据
*/
protected abstract void initDatas();
/**
* 预加载时用这个方法
*/
protected abstract void lazyLoad();
/**
*建议在此方法内绑定设置监听器、设置执行回调事件等操作
*/
protected abstract void setEvents();
public final <T extends View> T findViewById(@IdRes int id) {
return mRootView.findViewById(id);
}
public void getDataFromNet(Observable observable, Observer observer){
observable.observeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
}
/**
* 是否注册事件分发 默认不注册
* 重写此方法返回true来注册EventBus
* @return true:注册;false:不注册
*/
protected boolean isRegisteredEventBus(){
return false;
}
@Override
public void onDestroyView() {
super.onDestroyView();
unbinder.unbind();
isViewCreated = false;
isLoad = false;
if (isRegisteredEventBus()){
EventBusUtil.unregister(this);
}
}
@Override
public void onResume() {
super.onResume();
if (isRegisteredEventBus()){
if (!EventBusUtil.isRegistered(this)){
EventBusUtil.register(this);
}
}
}
}
修改fragment的状态栏的背景色
在fragment的lazyLoad()
方法里利用前面提到的工具修改状态栏颜色即可