Daniel Zlotin 8 years ago
parent
commit
a65eb8ae67

+ 0
- 6
android/app/src/main/java/com/reactnativenavigation/views/ContentView.java View File

@@ -2,10 +2,6 @@ package com.reactnativenavigation.views;
2 2
 
3 3
 import android.content.Context;
4 4
 import android.os.Bundle;
5
-import android.support.annotation.Nullable;
6
-import android.view.View;
7
-import android.view.ViewGroup;
8
-import android.widget.ScrollView;
9 5
 
10 6
 import com.facebook.react.ReactInstanceManager;
11 7
 import com.facebook.react.ReactRootView;
@@ -17,8 +13,6 @@ public class ContentView extends ReactRootView {
17 13
         startReactApplication(reactInstanceManager, moduleName, passProps);
18 14
     }
19 15
 
20
-
21
-
22 16
     @Override
23 17
     protected void onDetachedFromWindow() {
24 18
         super.onDetachedFromWindow();

+ 81
- 9
android/app/src/main/java/com/reactnativenavigation/views/RctView.java View File

@@ -22,6 +22,56 @@ public class RctView extends FrameLayout {
22 22
 
23 23
     private BottomTabActivity context;
24 24
     private ReactRootView reactRootView;
25
+    private ScrollView scrollView;
26
+    private int lastScrollY = -1;
27
+    private final ViewTreeObserver.OnScrollChangedListener scrollChangedListener = new ViewTreeObserver.OnScrollChangedListener() {
28
+        @Override
29
+        public void onScrollChanged() {
30
+            if (!scrollView.getViewTreeObserver().isAlive()) {
31
+                return;
32
+            }
33
+
34
+            final int scrollY = scrollView.getScrollY();
35
+            if (scrollY != lastScrollY && // Scroll position changed
36
+                scrollY > 0 && // Ignore top overscroll
37
+                scrollY < (scrollView.getChildAt(0).getHeight() - scrollView.getHeight())) { // Ignore bottom overscroll
38
+                int direction = scrollY > lastScrollY ?
39
+                        BottomNavigation.SCROLL_DIRECTION_DOWN :
40
+                        BottomNavigation.SCROLL_DIRECTION_UP;
41
+                lastScrollY = scrollY;
42
+                context.onScrollChanged(direction);
43
+            }
44
+        }
45
+    };
46
+    private boolean isScrollEventListenerRegistered = false;
47
+
48
+    private final View.OnAttachStateChangeListener stateChangeListener =
49
+            new View.OnAttachStateChangeListener() {
50
+                @Override
51
+                public void onViewAttachedToWindow(View v) {
52
+                    scrollView = getScrollView((ViewGroup) getParent());
53
+
54
+                    if (scrollView != null && !isScrollEventListenerRegistered) {
55
+                        addScrollListener();
56
+                    }
57
+                }
58
+
59
+                @Override
60
+                public void onViewDetachedFromWindow(final View detachedView) {
61
+                    removeScrollListener();
62
+
63
+                    post(new Runnable() {
64
+                        @Override
65
+                        public void run() {
66
+                            scrollView = getScrollView((ViewGroup) getParent());
67
+                            if (scrollView != null && !isScrollEventListenerRegistered) {
68
+                                isScrollEventListenerRegistered = true;
69
+                                addScrollListener();
70
+                            }
71
+                        }
72
+                    });
73
+                }
74
+            };
25 75
 
26 76
     /**
27 77
      * Interface used to run some code when the {@link ReactRootView} is visible.
@@ -40,16 +90,16 @@ public class RctView extends FrameLayout {
40 90
         setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
41 91
 
42 92
         final OnDisplayedListener onDisplayedListenerInternal = screen.bottomTabsHiddenOnScroll ?
43
-                new OnDisplayedListener() {
44
-                    @Override
45
-                    public void onDisplayed() {
46
-                        if (onDisplayedListener != null) {
47
-                            onDisplayedListener.onDisplayed();
48
-                        }
49
-
50
-                        setupScrollViewWithBottomTabs();
93
+            new OnDisplayedListener() {
94
+                @Override
95
+                public void onDisplayed() {
96
+                    if (onDisplayedListener != null) {
97
+                        onDisplayedListener.onDisplayed();
51 98
                     }
52
-                } : onDisplayedListener;
99
+
100
+                    setupScrollViewWithBottomTabs();
101
+                }
102
+            } : onDisplayedListener;
53 103
 
54 104
         reactRootView = new RnnReactRootView(ctx, onDisplayedListenerInternal);
55 105
         reactRootView.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
@@ -71,6 +121,28 @@ public class RctView extends FrameLayout {
71 121
         return passProps;
72 122
     }
73 123
 
124
+    private void setupScrollViewWithBottomTabs() {
125
+        scrollView = getScrollView((ViewGroup) getParent());
126
+        if (scrollView != null) {
127
+            context = (BottomTabActivity) getContext();
128
+            attachStateChangeListener(scrollView);
129
+            addScrollListener();
130
+        }
131
+    }
132
+
133
+
134
+    private void attachStateChangeListener(ScrollView scrollView) {
135
+        scrollView.addOnAttachStateChangeListener(stateChangeListener);
136
+    }
137
+
138
+    private void addScrollListener() {
139
+        scrollView.getViewTreeObserver().addOnScrollChangedListener(scrollChangedListener);
140
+    }
141
+
142
+    private void removeScrollListener() {
143
+        scrollView.getViewTreeObserver().removeOnScrollChangedListener(scrollChangedListener);
144
+    }
145
+
74 146
     /**
75 147
      * Must be called before view is removed from screen, but will be added again later. Setting mAttachScheduled
76 148
      * to true will prevent the component from getting unmounted once view is detached from screen.