From 5a93877673105ca13c9e587796432881e26a0de7 Mon Sep 17 00:00:00 2001 From: Angela Hess Date: Thu, 21 Apr 2016 19:42:25 -0700 Subject: [PATCH] Add ability to disable scroll on android ViewPager Summary: Similar to ScrollView, adds ability to set scrollEnabled={false}, which prevents dragging. Paging is still possible by updating initialPage. Reviewed By: AaaChiuuu Differential Revision: D3209743 fb-gh-sync-id: ce4140323a03f2257a9bb310c7285418b01abae7 fbshipit-source-id: ce4140323a03f2257a9bb310c7285418b01abae7 --- .../ViewPager/ViewPagerAndroid.android.js | 6 ++++++ .../react/views/viewpager/ReactViewPager.java | 15 ++++++++++++++- .../views/viewpager/ReactViewPagerManager.java | 6 ++++++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/Libraries/Components/ViewPager/ViewPagerAndroid.android.js b/Libraries/Components/ViewPager/ViewPagerAndroid.android.js index c43ee197045..50a88337b7a 100644 --- a/Libraries/Components/ViewPager/ViewPagerAndroid.android.js +++ b/Libraries/Components/ViewPager/ViewPagerAndroid.android.js @@ -123,6 +123,12 @@ var ViewPagerAndroid = React.createClass({ 'none', // default 'on-drag', ]), + + /** + * When false, the content does not scroll. + * The default value is true. + */ + scrollEnabled: React.PropTypes.bool, }, componentDidMount: function() { diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/viewpager/ReactViewPager.java b/ReactAndroid/src/main/java/com/facebook/react/views/viewpager/ReactViewPager.java index c522e039156..85fc79c9782 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/viewpager/ReactViewPager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/viewpager/ReactViewPager.java @@ -125,6 +125,7 @@ import com.facebook.react.uimanager.events.NativeGestureUtil; private final EventDispatcher mEventDispatcher; private boolean mIsCurrentItemFromJs; + private boolean mScrollEnabled = true; public ReactViewPager(ReactContext reactContext) { super(reactContext); @@ -141,19 +142,31 @@ import com.facebook.react.uimanager.events.NativeGestureUtil; @Override public boolean onInterceptTouchEvent(MotionEvent ev) { - if (super.onInterceptTouchEvent(ev)) { + if (mScrollEnabled && super.onInterceptTouchEvent(ev)) { NativeGestureUtil.notifyNativeGestureStarted(this, ev); return true; } return false; } + @Override + public boolean onTouchEvent(MotionEvent ev) { + if (!mScrollEnabled) { + return false; + } + return super.onTouchEvent(ev); + } + public void setCurrentItemFromJs(int item, boolean animated) { mIsCurrentItemFromJs = true; setCurrentItem(item, animated); mIsCurrentItemFromJs = false; } + public void setScrollEnabled(boolean scrollEnabled) { + mScrollEnabled = scrollEnabled; + } + /*package*/ void addViewToAdapter(View child, int index) { getAdapter().addView(child, index); } diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/viewpager/ReactViewPagerManager.java b/ReactAndroid/src/main/java/com/facebook/react/views/viewpager/ReactViewPagerManager.java index 710f2a4ebb3..093ef0fd831 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/viewpager/ReactViewPagerManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/viewpager/ReactViewPagerManager.java @@ -43,6 +43,12 @@ public class ReactViewPagerManager extends ViewGroupManager { return new ReactViewPager(reactContext); } + + @ReactProp(name = "scrollEnabled", defaultBoolean = true) + public void setScrollEnabled(ReactViewPager viewPager, boolean value) { + viewPager.setScrollEnabled(value); + } + @Override public boolean needsCustomLayoutForChildren() { return true;