From 69e98cfc75faafb5271c753fcfc784689c5ef0ba Mon Sep 17 00:00:00 2001 From: Adam Comella Date: Mon, 6 Feb 2017 07:22:09 -0800 Subject: [PATCH] Android: Add onScroll event to TextInput Summary: Corresponding iOS PR: https://github.com/facebook/react-native/pull/11002 This adds an onScroll event to TextInput which is useful when a multiline TextInput has so much content that it is scrollable. **Test plan (required)** Verified the event works properly in a test app. Also, my team uses this event in our app. Adam Comella Microsoft Corp. Closes https://github.com/facebook/react-native/pull/11001 Differential Revision: D4220941 Pulled By: mkonicek fbshipit-source-id: 7e420579946f2ae840c9e1fcdc8afab68007da17 --- Libraries/Components/TextInput/TextInput.js | 1 + .../com/facebook/react/views/textinput/BUCK | 1 + .../react/views/textinput/ReactEditText.java | 15 ++++++ .../textinput/ReactTextInputManager.java | 46 +++++++++++++++++++ .../react/views/textinput/ScrollWatcher.java | 14 ++++++ 5 files changed, 77 insertions(+) create mode 100644 ReactAndroid/src/main/java/com/facebook/react/views/textinput/ScrollWatcher.java diff --git a/Libraries/Components/TextInput/TextInput.js b/Libraries/Components/TextInput/TextInput.js index 88e6a16bb..1670f3745 100644 --- a/Libraries/Components/TextInput/TextInput.js +++ b/Libraries/Components/TextInput/TextInput.js @@ -739,6 +739,7 @@ const TextInput = React.createClass({ children={children} disableFullscreenUI={this.props.disableFullscreenUI} textBreakStrategy={this.props.textBreakStrategy} + onScroll={this._onScroll} />; return ( diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/textinput/BUCK b/ReactAndroid/src/main/java/com/facebook/react/views/textinput/BUCK index ae5cd06cd..b14cc057f 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/textinput/BUCK +++ b/ReactAndroid/src/main/java/com/facebook/react/views/textinput/BUCK @@ -14,6 +14,7 @@ android_library( react_native_target('java/com/facebook/react/uimanager:uimanager'), react_native_target('java/com/facebook/react/uimanager/annotations:annotations'), react_native_target('java/com/facebook/react/views/imagehelper:imagehelper'), + react_native_target('java/com/facebook/react/views/scroll:scroll'), react_native_target('java/com/facebook/react/views/text:text'), react_native_target('java/com/facebook/react/views/view:view'), ], diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java b/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java index 9e9fc6edc..1665bba19 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java @@ -80,6 +80,7 @@ public class ReactEditText extends EditText { private @Nullable String mReturnKeyType; private @Nullable SelectionWatcher mSelectionWatcher; private @Nullable ContentSizeWatcher mContentSizeWatcher; + private @Nullable ScrollWatcher mScrollWatcher; private final InternalKeyListener mKeyListener; private boolean mDetectScrollMovement = false; @@ -106,6 +107,7 @@ public class ReactEditText extends EditText { mTextWatcherDelegator = null; mStagedInputType = getInputType(); mKeyListener = new InternalKeyListener(); + mScrollWatcher = null; } // After the text changes inside an EditText, TextView checks if a layout() has been requested. @@ -171,6 +173,15 @@ public class ReactEditText extends EditText { return super.onKeyUp(keyCode, event); } + @Override + protected void onScrollChanged(int horiz, int vert, int oldHoriz, int oldVert) { + super.onScrollChanged(horiz, vert, oldHoriz, oldVert); + + if (mScrollWatcher != null) { + mScrollWatcher.onScrollChanged(horiz, vert, oldHoriz, oldVert); + } + } + @Override public void clearFocus() { setFocusableInTouchMode(false); @@ -220,6 +231,10 @@ public class ReactEditText extends EditText { mContentSizeWatcher = contentSizeWatcher; } + public void setScrollWatcher(ScrollWatcher scrollWatcher) { + mScrollWatcher = scrollWatcher; + } + @Override public void setSelection(int start, int end) { // Skip setting the selection if the text wasn't set because of an out of date value. diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputManager.java b/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputManager.java index d7dc063d3..b0ed4cf83 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputManager.java @@ -48,6 +48,8 @@ import com.facebook.react.uimanager.annotations.ReactProp; import com.facebook.react.uimanager.annotations.ReactPropGroup; import com.facebook.react.uimanager.events.EventDispatcher; import com.facebook.react.views.imagehelper.ResourceDrawableIdHelper; +import com.facebook.react.views.scroll.ScrollEvent; +import com.facebook.react.views.scroll.ScrollEventType; import com.facebook.react.views.text.DefaultStyleValuesUtil; import com.facebook.react.views.text.ReactFontManager; import com.facebook.react.views.text.ReactTextUpdate; @@ -278,6 +280,15 @@ public class ReactTextInputManager extends BaseViewManager