Android ViewPage2 滑动冲突解决方案之一

1,168 阅读1分钟

1.解决方案

public void setUserInputEnabled(boolean enabled) {
        mUserInputEnabled = enabled;
        mAccessibilityProvider.onSetUserInputEnabled();
}

当需要禁用viewPage2的滑动时,setUserInputEnabled(false)

当不需要禁用viewPage2的滑动时, setUserInputEnabled(true)

这两个调用需要配对使用,如果只调用第一个方法,viewPage2将永远不能滑动

2.原理

viewPage2内部是用RecyclerView来实现滑动切换页面,内部源码:

private class RecyclerViewImpl extends RecyclerView {
        ......

        @SuppressLint("ClickableViewAccessibility")
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            return isUserInputEnabled() && super.onTouchEvent(event);
        }

        @Override
        public boolean onInterceptTouchEvent(MotionEvent ev) {
            return isUserInputEnabled() && super.onInterceptTouchEvent(ev);
        }
    }

从onTouchEventon() 、InterceptTouchEvent()这两个方法可以看出,ViewPager2内部是否接收或者拦截屏幕事件都与isUserInputEnabled()这个方法返回值有关,当返回值为true不拦截或者接收屏幕事件,反之事件处理方式决定于RecyclerView。而这个方法的返回值可以通过setUserInputEnabled()方法设置。

  public boolean isUserInputEnabled() {
        return mUserInputEnabled;
  }
public void setUserInputEnabled(boolean enabled) {
        mUserInputEnabled = enabled;
        mAccessibilityProvider.onSetUserInputEnabled();
}