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