Skip to content

Commit c616148

Browse files
andreacassanifacebook-github-bot
authored andcommitted
Fix Android ScrollView not responding to Keyboard events when nested inside a KeyboardAvoidingView (#38728)
Summary: Starting from RN 0.72.0, when we nest a ScrollView inside a KeyboardAvoidingView, the ScrollView doesn't respond properly to the Keyboard on Android. https://github.com/facebook/react-native/assets/32062066/a62b5a42-6817-4093-91a2-7cc9e4a315bb This issue is due to a change made in #36104, which was added to fix #32235. That commit changed this line of code to abort the Scroller animation if a new call to the `scrollTo` method was made: https://github.com/facebook/react-native/blob/aab52859a447a8257b106fe307008af218322e3d/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java#L1073 Apparently, this is the same method that scrolls the ScrollView in response to the Keyboard opening on Android. So, here comes my proposal for a fix that doesn't break #36104 and fixes #38152. When we open the Keyboard, the call stack is as follows: - InputMethodManager - AndroidIME - InsetsController - `ReactScrollView.scrollTo` gets called When we use the ScrollView method `scrollTo` directly from the UI, the call stack is different as it goes through: - ReactScrollViewCommandHelper - ReactScrollViewManager - `ReactScrollView.scrollTo` gets called We can move `mScroller.abortAnimation();` from `ReactScrollView.scrollTo` to the `ReactScrollViewManager.scrollTo` method so that it gets called only when we call `scrollTo` from the UI and not when the `scrollTo` method is called by other sources. https://github.com/facebook/react-native/assets/32062066/9c10ded3-08e5-48e0-9a85-0987d62de011 ## Changelog: [ANDROID] [FIXED] - Fixed ScrollView not responding to Keyboard events when nested inside a KeyboardAvoidingView Pull Request resolved: #38728 Test Plan: You can see the issue and the proposed fixes in this repo: [kav-test-android](https://github.com/andreacassani/kav-test-android). Please refer to the `kav_test_fix` folder and to the [readme](https://github.com/andreacassani/kav-test-android/blob/main/README.md). Reviewed By: NickGerleman Differential Revision: D47972445 Pulled By: ryancat fbshipit-source-id: e58758d4b3d5318b947b42a88a56ad6ae69a539c
1 parent 7c79e31 commit c616148

File tree

2 files changed

+7
-1
lines changed

2 files changed

+7
-1
lines changed

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,12 @@ public void setDecelerationRate(float decelerationRate) {
218218
}
219219
}
220220

221+
public void abortAnimation() {
222+
if (mScroller != null && !mScroller.isFinished()) {
223+
mScroller.abortAnimation();
224+
}
225+
}
226+
221227
public void setSnapInterval(int snapInterval) {
222228
mSnapInterval = snapInterval;
223229
}
@@ -1070,7 +1076,6 @@ public void reactSmoothScrollTo(int x, int y) {
10701076
*/
10711077
@Override
10721078
public void scrollTo(int x, int y) {
1073-
mScroller.abortAnimation();
10741079
super.scrollTo(x, y);
10751080
ReactScrollViewHelper.updateFabricScrollState(this);
10761081
setPendingContentOffsets(x, y);

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollViewManager.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,7 @@ public void flashScrollIndicators(ReactScrollView scrollView) {
213213
@Override
214214
public void scrollTo(
215215
ReactScrollView scrollView, ReactScrollViewCommandHelper.ScrollToCommandData data) {
216+
scrollView.abortAnimation();
216217
if (data.mAnimated) {
217218
scrollView.reactSmoothScrollTo(data.mDestX, data.mDestY);
218219
} else {

0 commit comments

Comments
 (0)