采用Lazy方式加载的Fragment

来源:互联网 发布:乐高电机有哪些端口 编辑:程序博客网 时间:2024/05/29 17:24



https://github.com/xmagicj/LazyFragment/blob/master/app/src/main/java/com/xmagicj/android/lazyfragment/BaseFragment.java




<span style="font-size:18px;">import android.os.Bundle;import android.support.v4.app.Fragment;import android.text.TextUtils;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;/** * <pre> * 若把初始化内容放到initData实现 * 就是采用Lazy方式加载的Fragment * 若不需要Lazy加载则initData方法内留空,初始化内容放到initViews即可 * * 注1: * 如果是与ViewPager一起使用,调用的是setUserVisibleHint。 * * 注2: * 如果是通过FragmentTransaction的show和hide的方法来控制显示,调用的是onHiddenChanged. * 针对初始就show的Fragment 为了触发onHiddenChanged事件 达到lazy效果 需要先hide再show * eg: * transaction.hide(aFragment); * transaction.show(aFragment); * * Created by Mumu * on 2015/11/2. * </pre> */public abstract class BaseFragment extends Fragment {    /**     * Fragment title     */    public String fragmentTitle;    /**     * 是否可见状态     */    private boolean isVisible;    /**     * 标志位,View已经初始化完成。     */    private boolean isPrepared;    /**     * 是否第一次加载     */    private boolean isFirstLoad = true;    @Override    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {        isFirstLoad = true;        View view = initViews(inflater, container, savedInstanceState);        isPrepared = true;        lazyLoad();        return view;    }    /**     * 如果是与ViewPager一起使用,调用的是setUserVisibleHint     *     * @param isVisibleToUser 是否显示出来了     */    @Override    public void setUserVisibleHint(boolean isVisibleToUser) {        super.setUserVisibleHint(isVisibleToUser);        if (getUserVisibleHint()) {            isVisible = true;            onVisible();        } else {            isVisible = false;            onInvisible();        }    }    /**     * 如果是通过FragmentTransaction的show和hide的方法来控制显示,调用的是onHiddenChanged.     * 若是初始就show的Fragment 为了触发该事件 需要先hide再show     *     * @param hidden     */    @Override    public void onHiddenChanged(boolean hidden) {        super.onHiddenChanged(hidden);        if (!hidden) {            isVisible = true;            onVisible();        } else {            isVisible = false;            onInvisible();        }    }    protected void onVisible() {        lazyLoad();    }    protected void onInvisible() {    }    /**     * 要实现延迟加载Fragment内容,需要在 onCreateView     * isPrepared = true;     */    protected void lazyLoad() {        if (!isPrepared || !isVisible || !isFirstLoad) {            return;        }        isFirstLoad = false;        initData();    }    protected abstract View initViews(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState);    protected abstract void initData();    public String getTitle() {        if (null == fragmentTitle) {            setDefaultFragmentTitle(null);        }        return TextUtils.isEmpty(fragmentTitle) ? "" : fragmentTitle;    }    public void setTitle(String title) {        fragmentTitle = title;    }    /**     * 设置fragment的Title直接调用 {@link BaseFragment#setTitle(String)},若不显示该title 可以不做处理     *     * @param title 一般用于显示在TabLayout的标题     */    protected abstract void setDefaultFragmentTitle(String title);}</span>


0 1
原创粉丝点击