1.前言:
Fragment与ViewPager联用时,如何判断当前pager是否可见?大家都知道Fragment是依附在Activity上的,Fragment的生命周期中有onStart,onStop方法,但是并不能像Activity那样通过这些方法判断Fragment可不可见。
因为这两个方法只有在当前这个fragment所依附的activity不可见时才会执行,并不是单纯的fragment可不可见。所以就需要利用另外一种形式来判断:就是通过setUserVisibleHint()方法。
2.内容:
以下代码是在viewpager中加载fragment,避免页面不可见时,就去加载数据。
(1)首先定义一个变量,用来判断当前fragment是否可见:
private boolean isFragmentVisible;
(2)在定义一个变量判断是否已经创建了View对象:
private boolean hasCreateView;
(3)定义一个变量,用来子类创建View时,返回的结果:
protected View rootView;
(4)在onCreate方法中设置变量的初始化值 hasCreateView = false; isFragmentVisible = false;判断是否可见:
@Override
public void setUserVisibleHint(boolean isVisible) {
super.setUserVisibleHint(isVisible);
if (rootView == null)
return;
hasCreateView = true;
if (isVisible) {
onVisibleChange(true);
isFragmentVisible = true;
return;
}
if (isFragmentVisible) {
onVisibleChange(false);
isFragmentVisible = false;
}
}
(5)在onVisibleChange()方法中进行可见与不可见的判断:
protected void onVisibleChange(boolean isVisible) {
if(isVisible){
//可见
}else{
//不可见
}
}
3.完整代码:
public abstract class VisibilityFragment extends Fragment {
// 是否已经创建了根布局
private boolean hasView;
// 当前Fragment是否可见
private boolean isFragmentVisible;
// 根布局
protected View rootView;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
hasView = false;
isFragmentVisible = false;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
rootView = initView(inflater);
return rootView;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
if (!hasView && getUserVisibleHint()) {
onVisibleChange(true);
isFragmentVisible = true;
}
initView();
}
@Override
public void setUserVisibleHint(boolean isVisible) {
super.setUserVisibleHint(isVisible);
if (rootView == null) {
return;
}
hasView = true;
if (isVisible) {
onVisibleChange(true);
isFragmentVisible = true;
return;
}
if (isFragmentVisible) {
onVisibleChange(false);
isFragmentVisible = false;
}
}
// 可见与不可见的处理
protected void onVisibleChange(boolean isVisible) {
if(isVisible){
}else{
}
}
// 子类创建View,必须实现
protected abstract View initView();
}