目录
一、Fragment 对用户可见的必要条件
fragment 是否对用户可见,依赖于下面三个方法:
getUserVisibleHint
onResume
onStop
用户可见:getUserVisibleHint()返回true 并且 onResume刚刚调用了
二、举例说明
1. 一个Activity,四个fragment,依次是图片、视频、音频、文件
2.代码:
2.1 代码介绍
代码分三步
1. 本地变量,用于记录状态
2. 自定义方法,用于判断fragment真实展现,不要用其提供的isVisible()方法
3. demo 打印日志,用于讲解
// 1. 本地变量,用于记录状态
private String mName;
private boolean mResume = false;// 标记onResume是否被刚刚调用
// 2. 自定义方法,用于判断fragment真实展现,不要用其提供的isVisible()方法
public boolean isRealVisible(){
return getUserVisibleHint() && mResume;
}
// 3. demo 打印日志,用于讲解
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
Log.e("TestFragment", "setUserVisibleHint mName="+ mName +" isVisibleToUser:"+isVisibleToUser+"\tisVisible:"+isVisible()+"\tisRealVisible:"+isRealVisible());
}
@Override
public void onResume() {
super.onResume();
mResume=true;
Log.e("TestFragment", "onResume mName="+mName+"\tisVisible:"+isVisible()+"\tisRealVisible:"+isRealVisible());
}
@Override
public void onStop() {
super.onStop();
mResume=false;
Log.e("TestFragment", "onStop mName="+mName+"\tisVisible:"+isVisible()+"\tisRealVisible:"+isRealVisible());
}
2.2 各种状态的log
2.2.1 进入Activity
Activity显示加载前两个fragment:图片、视频
之后图片调用setUserVisibleHint(true),
最后分别调用图片、视频的onResume
注意:此时系统的 isVisible 返回了true
2.2.2 滑动到tab2视频
1. Activity先加载tab3音频,并调用setVisibleToUser, 设置音频为false、图片为false、视频为true
2.调用音频的onResume
2.2.3 回到桌面
调用已加载fragment的onStop方法
2.2.3 从桌面返回程序
调用已加载fragment的onResume方法
2.2.4 从tab2视频滑到到tab1图片
仅仅调用了视频、图片的setVisibleToUser方法,视频为false,图片为true
2.2.5 从tab1图片进入其他activity
调用已加载fragment的onStop方法
2.2.6 从其他activity返回tab1图片
调用已加载fragment的onResume方法
2.2.7 从tab1图片,点击tab4文件进入tab4
1. Activity先加载tab3音频,并调用setVisibleToUser, 设置文件为false,音频为false、图片为false、文件为true
2.调用视频的onResume