ViewPager+Fragment使用动态修改每个fragment的状态栏颜色以及Fragment的懒加载

工作中需要用到懒加载的地方可能有很多,比如ViewPager+Fragment的使用时,要求不同的Fragment的状态栏颜色不一样,这样就需要动态修改状态栏的颜色。

因为viewpager是有最小缓存的,所以直接在fragment里写修改每个fragment的状态栏颜色是不会起作用的。因为缓存的作用,代码已经提前执行了。所以必须用Fragment懒加载,当gragment可见时去修改状态栏的颜色,这样只是修改当前的Fragment的,不会影响其他fragment。


先说一下,修改状态栏颜色

网上有很多解决方法,Github上也有不少开源库,比如StatusBarUtilImmersionBar,自己选择其中一种方案即可

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()方法里利用前面提到的工具修改状态栏颜色即可

发布了62 篇原创文章 · 获赞 45 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/parade0393/article/details/100881820
今日推荐