如何判断Fragment是否对用户可见

2024-11-16 01:55:37
推荐回答(2个)
回答(1):

判断Fragment是否对用户可见的方法是通过setUserVisibleHint来实现的。
1、通过重写setUserVisibleHint来动态设定Fragment是否可见
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
isVisible = isVisibleToUser;
// Make sure that fragment is currently visible
if (!isVisible && isResumed()) {
// 调用Fragment隐藏的代码段
} else if (isVisible && isResumed()) {
// 调用Fragment显示的代码段
}
}
2、setUserVisibleHint这个方法默认是true,确实是需要用户手动调用的,如果你使用fragment配合FragmentPagerAdapter使用的话,adapter会在内部控制setUserVisibleHintFragment() 这个方法(请看FragmentPagerAdapter源码) ,如果是自己控制fragment的话,就需要手动调用setUserVisibleHintFragment() 这个方法了。

回答(2):

由于在ViewPage中PageAdapter来管理所有的Fragment。在加载一个Fragment的时候,会自动缓存左右几个(默认是一个)页面,此时也会调用到正常的生命周期函数,onCreate,onCrateView,onResume.可是这样就干扰了我们统计页面打开次数。
例如:一个ViewPager中存在三个页面的时候,当默认是第一个页面,并且被打开。那么在我们的后台就会收集到用户打开两个页面的信息。这个对我们的统计就是一个很大的干扰。所以就不能再将统计代码放在onResume中,要放在一个其他的函数内,但问题的关键是如何确认当前的Fragment可见?这样我才能把统计函数移植过去。同时Fragment虽然有onResume和onPause的,但是这两个方法是Activity的方法,调用时机也是与Activity相同,和ViewPager搭配使用这个方法就很鸡肋了,根本不是你想要的效果,这里介绍一种方法。

在问这个问题的时候把焦点都放在生命周期的触发上了。发现Fragment下专门有一个setUserVisibleHint函数来处理这个事情:

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
//相当于Fragment的onResume
} else {
//相当于Fragment的onPause
}
}

这样我把统计代码放置在当isVisibleToUser是可见的时候判断分支中,应该可以解决我的问题了。

转载