Android 判断Fragment对用户是否可见

最近开发视频相关的项目,中间遇到了在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 不可见操作
}

注:以上方法存在一个问题,即可见方法和不可见方法存在多次调用的问题。如果对这个也有需求可以针对自己的业务逻辑做相应的过滤处理。

你可能感兴趣的:(android)