一、Requirement
适用场景:
- ViewPager加载Fragment
- fragment显示的时候才加载数据
- ViewPager切换,隐藏的fragment可以取消
- 跳转其他页面请求取消,
- 返回页面重新请求
注意:普通Activity中fragment懒加载不用此种方式显示
二、Demo
三、Theory
viewPager加载和切换fragment的时候setUserVisibleHint会调用,参数isVisibleToUser告知会显示还是隐藏
第一次加载fragment的时候setUserVisibleHint会调用两次,同时Fragment的view不一定创建了,
fragment的onResume和onPause受到Activity的方法影响
定义onVisible和onInVisible方法,表示fragment的显示与消失
- 主要靠setUserVisibleHint来调用onVisible和onInVisible,定义标记flag,在onResume和onPause中补充
三 CoreCode
public class ViewPagerLazyFragment extends Fragment {
public static final String TAG = "ViewPagerListener";
private String mType;
//标记需要等待回调onMyResume;
private boolean isWaitingForOnMyResume = false;
public static ViewPagerLazyFragment newInstance(String type) {
Bundle args = new Bundle();
args.putString("type", type);
ViewPagerLazyFragment fragment = new ViewPagerLazyFragment();
fragment.setArguments(args);
return fragment;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.view_pager_listener_fragment, null);
mType = getArguments().getString("type");
((TextView) view.findViewById(R.id.tv_tag)).setText(mType);
view.findViewById(R.id.tv_jump).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getContext().startActivity(new Intent(getContext(),OtherActivity.class));
}
});
return view;
}
@Override
public void onResume() {
super.onResume();
if (isWaitingForOnMyResume && getUserVisibleHint()) {
isWaitingForOnMyResume = false;
onVisible();
}
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
Log.i(TAG,"ViewPagerListenerFragment setUserVisibleHint() type = " + mType + " isVisibleToUser="+isVisibleToUser);
if (isVisibleToUser) {
if (isResumed()) {
onVisible();
} else {
isWaitingForOnMyResume = true;
}
} else {
if (isResumed())
onInVisible();
}
}
@Override
public void onPause() {
super.onPause();
if(getUserVisibleHint()){
isWaitingForOnMyResume = true;
onInVisible();
}
Log.i(TAG,"ViewPagerListenerFragment onPause() type = "+mType);
}
/**
* viewPager中界面每次可见调用;
*/
public void onVisible() {
Log.i(TAG,"ViewPagerListenerFragment onVisible() type = " + mType);
}
/**
* viewPager中界面每次不可见调用;
*/
public void onInVisible() {
Log.i(TAG,"ViewPagerListenerFragment onInVisible() type = " + mType);
}
}