Fragment判断页面是否可见

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













猜你喜欢

转载自blog.csdn.net/wangwasdf/article/details/76906509
今日推荐