主要是Fragment实现懒加载,直接继承此类即可,
import android.os.Bundle;
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;
public abstract class LazyFragment extends Fragment {
FragmentDelegater mFragmentDelegater;
private View rootView = null;
private boolean isViewCreated = false;
private boolean isCurrentVisibleState = false;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
E("onCreateView: ");
if (rootView == null) {
rootView = inflater.inflate(getLayoutRes(), container, false);
}
initView(rootView);
isViewCreated = true;
// 本次分发主要时用于分发默认tab可见状态,这种状况下它的生命周期是:1 fragment setUserVisibleHint: true-》onAttach-》onCreate-》onCreateView-》onResume
// 默认 Tab getUserVisibleHint() = true !isHidden() = true
// 对于非默认 tab 或者非默认显示的 Fragment 在该生命周期中只做了 isViewCreated 标志位设置 可见状态将不会在这里分发
if (getUserVisibleHint()) {
setUserVisibleHint(true);
}
return rootView;
}
protected abstract void initView(View rootView);
protected abstract int getLayoutRes();
//修改fragment的可见性
//setUserVisibleHint 被调用有两种情况:
// 1) 在切换tab的时候,会先于所有fragment的其他生命周期,先调用这个函数,可以看log,
// 对于默认 tab 和 间隔 checked tab 需要等到 isViewCreated = true 后才可以通过此通知用户可见
//2)对于之前已经调用过setUserVisibleHint 方法的fragment后,让fragment从可见到不可见之间状态的变化
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
E("setUserVisibleHint: " + isVisibleToUser);
if (isViewCreated) {
if(isVisibleToUser && !isCurrentVisibleState) {
dispatchUserVisibleHint(true);
} else if (isCurrentVisibleState && !isVisibleToUser){
dispatchUserVisibleHint(false);
}
}
}
//如果可见:加载网络,否则不加载网络
private void dispatchUserVisibleHint(boolean visibleState) {
if (isCurrentVisibleState == visibleState) {
return;
}
isCurrentVisibleState = visibleState;
if (visibleState) {
onFragmentLoad();
} else {
onFragmentLoadStop();
}
}
//停止加载网络
public void onFragmentLoadStop() {
}
// 触发加载网络
public void onFragmentLoad() {
}
@Override
public void onResume() {
super.onResume();
if (getUserVisibleHint()) {
dispatchUserVisibleHint(true);
}
}
@Override
public void onPause() {
super.onPause();
E("onPause");
if (getUserVisibleHint()) {
dispatchUserVisibleHint(false);
}
}
@Override
public void onDestroyView() {
super.onDestroyView();
E("onDestroyView");
isViewCreated = false;
}
public void setFragmentDelegater(FragmentDelegater fragmentDelegater) {
mFragmentDelegater = fragmentDelegater;
}
private void E(String string) {
if (mFragmentDelegater != null) {
mFragmentDelegater.dumpLifeCycle(string);
}
}
}