1、首先定义一个基类BaseFragment
2、
//定义一个View加载布局
private View view;
// 定义 rootView是否初始化标志,防止回调函数在rootView为空时触发
private boolean hasCreateView;
// 判断当前Fragment是否可见标志,防止ViewPager缓存机制而导致回调函数的触发
private boolean isFragmentVisible;
3、
@Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { view = inflater.inflate(R.layout.fragment_base, container, false); return view; }
public void setUserVisibleHint(boolean isVisibleToUser){
super.setUserVisibleHint(isVisibleToUser);
if(view == null){
return;
}
hasCreateView = true;
if(isVisibleToUser){
onFragmentVisibleChange(true);
isFragmentVisible = true;
return;
}
if(isFragmentVisible){
onFragmentVisibleChange(false);
isFragmentVisible = false;
}
}
//初始化判断的boolean值 在onCreate里调用
private void initVisible(){
hasCreateView = false;
isFragmentVisible = false;
}
/**
当前Fragment可见状态时会调用次方法
如果当前Fragment是第一次加载,等待onCreateView后才调用该方法,其他情况调用时机跟setUserVisibleHint(boolean isVisibleToUser) 一样
在该方法中可以调用一些网络请求,也可以是控件的操作,因为配合fragment复用view 机制,所以不用担心会报空指针异常
**/
protected void onFragmentChange(boolean isVisible){
}
//在onViewCreated进行判断
@Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); if (!hasCreateView && getUserVisibleHint()) { onFragmentVisibleChange(true); isFragmentVisible = true; } }
在Fragment里面调用
@Override protected void onFragmentVisibleChange(boolean isVisible) { super.onFragmentVisibleChange(isVisible); if (isVisible) { //进行操作 } }