最近开发视频相关的项目,中间遇到了在Fragment中处理视频播放器的播放状态,这里就涉及到了Fragment各种状态的获取,判断Fragment在不同的状态下是否可见,接下来就针对项目中经常使用到的Fragment进行显示隐藏状态进行说明,以加深自己的理解
Activity中的Fragment使用
1.通过addFragment或replaceFrament
这种情况下Fragment的处理比较简单,常用的场景是主界面点击不同的底部Tab,切换不同的Fragment。在Activity中使用XML引入,或者使用FragmentManager 的addFragment或者replaceFrament 动态载入。在这种情况下,只要监听Fragment的onResume和onPause方法就能够判断其显隐。
@Override
public void onResume() {
super.onResume();
//TODO 可见操作
}
@Override
public void onPause() {
super.onPause();
//TODO 不可见操作
}
2.通过showFragment和hideFragment
FragmentManager除了addFragment和replaceFragment之外,还有showFragment和hideFragment来做Fragment的显隐,这样可以提生页面切换的速度,是一种用空间换时间的方式。但是这样使用的Fragment在被hide的时候是不会调用onPause方法的。因为它只是在屏幕中不可见了,但是没有Pause。这时候我们需要监听onHiddenChanged方法
@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
if(hidden){
//TODO 不可见操作
} else {
//TODO 可见操作
}
}
这里还需要注意,如果用户直接按home键退出了,我们的程序也没有对按home键事件进行监听,在按home键时调用hideFragment,那么onHiddenChanged事实上没有被调用,反而是onPause被调用了。因此,我们需要在onPause中做一下相关的处理。
ViewPager中的Fragment使用
ViewPager控件也是我们开发过程中常用的控件,ViewPager中当滑到某一个Fragment时,它会同时加载这个Fragment的左右两个分页面,比如我从A页面切换到了B页面,那么C页面的onResume也被调用了,但是C页面其实对用户是不可见的。这时候我们就需要监听setUserVisibleHint来判断到底对用户是否可见。
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if(isVisibleToUser){
//TODO 可见操作
} else {
//TODO 不可见操作
}
}
但是和上面的情况类似,我们不能完全依赖setUserVisibleHint这个方法,来判断ViewPager中的页面是否对用户可见。因为该方法只有在Fragment切换的时候被调用。比如我从一个含有ViewPager的Actvity跳转到另一个activity,ViewPager中的Fragment的 setUserVisibleHint方法是不会被调用的,只能通过onPause来判断。因此,我们需要结合setUserVisibleHint和onResume和onPause。
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if ((isVisibleToUser && isResumed())) {
// TODO 可见操作
} else if (!isVisibleToUser) {
// TODO 不可见操作
}
}
@Override
public void onResume() {
super.onResume();
if (getUserVisibleHint()) {
//TODO 可见操作
}
}
@Override
public void onPause() {
super.onPause();
//TODO 不可见操作
}
注:以上方法存在一个问题,即可见方法和不可见方法存在多次调用的问题。如果对这个也有需求可以针对自己的业务逻辑做相应的过滤处理。