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(); }