前言
最近在重构项目时,导航滑动使用activity嵌套fragment,在fragment中需要判断此fragment是否对用户可见,特此在这记录下解决方案。
几种情况
(1)ViewPager中嵌套几个fragment
由于ViewPager的预加载效应,当从页面1切换到页面2的时候,虽然页面3对于用户看不见,其实已经把页面3加载出来了,会调用页面3的onResume()方法,我们可以通过setUserVisibleHint()方法来判断当前fragment是否可见
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
try{
if(getUserVisibleHint()){//界面可见时
initReqUnreadNotice();
getCacheSize();
}
}catch (Exception e){
e.printStackTrace();
}
}
注意此方法只会在不同fragment切换时才会调用,如果从fragment跳转到activity是不会调用此方法的,是不会调用setUserVisibleHint方法的,这时就要根据onResume和onPause方法来判断界面是否显示
(2)使用Activity直接引入 或者通过FragmentManager的addFragment或replaceFragment动态载入,只要监听Fragment的onResume和onPause方法就能够判断其显隐。
@Override
public void onResume() {
super.onResume();
updateUserState();
}
@Override
public void onPause() {
super.onPause();
//...
}
(3)通过FragmentManager的showFragment和hideFragment加载fragment时,显示与隐藏fragment,隐藏fragment时并没有调用onPause()方法,这时需要根据onHiddenChanged方法来判断
@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
if(hidden){
//...显示的操作
} else {
//...隐藏的操作
}
}
如果用户直接按home键退出了,我们的程序也没有对按home键事件进行监听,在按home键时调用hideFragment,那么onHiddenChanged事实上没有被调用,反而是onPause被调用了。所以我们需要针对这样的情况做特殊的处理。比如在home键退出时显示调用一下hideFragment或者在onPause中也发信号说本Fragment不可见了,这都是可以的。
参考文档:http://www.sixwolf.net/blog/2016/01/14/how-to-judge-if-fragment-is-visible-to-user/