fragment原本的onResume和onPause是和依附的activity同步的,这就导致了fragment不可视的时候,例如activity用viewpager嵌套fragment的时候,fragment并没有调用原本的onResume和onPause方法,按照直观的角度考虑,就是通过判断fragment是否被看到来赋予fragment的onResume和onPause方法,基本思路是继承一个fragment基类,重写setUserVisibleHint和onHiddenChanged方法
public class FragmentBase extends Fragment {
@Override
public void onDestroy() {
super.onDestroy();
onDestroyed();
RefWatcher refWatcher = ((BaseActivity) getActivity()).getKgApplication().refWatcher();
if (null != refWatcher) {
refWatcher.watch(this);
}
}
@Override
public void onResume() {
mShow = true;
super.onResume();
}
@Override
public void onPause() {
mShow = false;
super.onPause();
}
private boolean mDestroyed = false;
public boolean mShow;
boolean mOnCreated;
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (!mOnCreated) {
mOnCreated = true;
return;
}
if (isVisibleToUser) {
onFragmentVisible();
} else {
onFragmentInvisible();
}
}
@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
if (!hidden) {
onFragmentVisible();
} else {
onFragmentInvisible();
}
}
//该方法相当于Activity.onResume
public void onFragmentVisible() {
}
//该方法相当于Activity.onPause
public void onFragmentInvisible() {
}
@Override
public void onDestroyView() {
mDestroyed = true;
super.onDestroyView();
}
@Override
public boolean isDestroy() {
return mDestroyed;
}
@Override
public void onDestroyed() {
}
}
其实由于viewpager的预加载机制,在viewpager里面的fragment 其生命周期会发生混乱而且onHiddenChanged不起作用, 例如onresume方法在没有用户可见的情况下就会调用,就需要重写setUserVisibleHint方法来完成