Ver código fonte

Get screen LayoutParams from parent

Guy Carmeli 8 anos atrás
pai
commit
36bcfd03de

+ 20
- 13
android/app/src/main/java/com/reactnativenavigation/layouts/BottomTabsLayout.java Ver arquivo

@@ -1,5 +1,6 @@
1 1
 package com.reactnativenavigation.layouts;
2 2
 
3
+import android.support.annotation.NonNull;
3 4
 import android.support.v7.app.AppCompatActivity;
4 5
 import android.view.View;
5 6
 import android.widget.RelativeLayout;
@@ -42,19 +43,24 @@ public class BottomTabsLayout extends RelativeLayout implements Layout, AHBottom
42 43
 
43 44
     private void addScreenStacks() {
44 45
         for (int i = 0; i < screenStacks.length; i++) {
45
-            createAndAddScreenStack(i);
46
+            createAndAddScreens(i);
46 47
         }
47 48
     }
48 49
 
49
-    private void createAndAddScreenStack(int position) {
50
-        ScreenStack newStack = new ScreenStack(activity, params.tabParams.get(position), this);
50
+    private void createAndAddScreens(int position) {
51
+        ScreenStack newStack = new ScreenStack(activity, this, this);
52
+        ScreenParams screenParams = params.tabParams.get(position);
53
+        newStack.pushInitialScreen(screenParams, createScreenLayoutParams(screenParams));
51 54
         screenStacks[position] = newStack;
52
-        newStack.setVisibility(INVISIBLE);
53
-        addScreenStack(newStack);
54 55
     }
55 56
 
56
-    private void addScreenStack(ScreenStack newStack) {
57
-        addView(newStack, 0, new LayoutParams(MATCH_PARENT, MATCH_PARENT));
57
+    @NonNull
58
+    private LayoutParams createScreenLayoutParams(ScreenParams params) {
59
+        LayoutParams lp = new LayoutParams(MATCH_PARENT, MATCH_PARENT);
60
+        if (params.styleParams.drawScreenAboveBottomTabs) {
61
+            lp.addRule(RelativeLayout.ABOVE, bottomTabs.getId());
62
+        }
63
+        return lp;
58 64
     }
59 65
 
60 66
     private void createBottomTabs() {
@@ -122,7 +128,7 @@ public class BottomTabsLayout extends RelativeLayout implements Layout, AHBottom
122 128
 
123 129
     @Override
124 130
     public void push(ScreenParams screenParams) {
125
-        getCurrentScreenStack().push(screenParams);
131
+        getCurrentScreenStack().push(screenParams, createScreenLayoutParams(screenParams));
126 132
         bottomTabs.setStyleFromScreen(screenParams.styleParams);
127 133
     }
128 134
 
@@ -142,11 +148,12 @@ public class BottomTabsLayout extends RelativeLayout implements Layout, AHBottom
142 148
     public void newStack(ScreenParams params) {
143 149
         ScreenStack currentScreenStack = getCurrentScreenStack();
144 150
         currentScreenStack.destroy();
145
-        removeView(currentScreenStack);
151
+        removeView(currentScreenStack.peek());
146 152
 
147
-        ScreenStack newStack = new ScreenStack(activity, params, this);
153
+        ScreenStack newStack = new ScreenStack(activity, this, this);
154
+        LayoutParams lp = createScreenLayoutParams(params);
155
+        newStack.pushInitialScreen(params, lp);
148 156
         screenStacks[currentStackIndex] = newStack;
149
-        addView(newStack, 0, new RelativeLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT));
150 157
 
151 158
         bottomTabs.setStyleFromScreen(params.styleParams);
152 159
     }
@@ -170,13 +177,13 @@ public class BottomTabsLayout extends RelativeLayout implements Layout, AHBottom
170 177
     }
171 178
 
172 179
     private void showStackAndUpdateStyle(ScreenStack newStack) {
173
-        newStack.setVisibility(VISIBLE);
180
+        newStack.showScreen();
174 181
         bottomTabs.setStyleFromScreen(newStack.getCurrentScreenStyleParams());
175 182
     }
176 183
 
177 184
     private void hideCurrentStack() {
178 185
         ScreenStack currentScreenStack = getCurrentScreenStack();
179
-        currentScreenStack.setVisibility(INVISIBLE);
186
+        currentScreenStack.hideScreen();
180 187
     }
181 188
 
182 189
     private ScreenStack getCurrentScreenStack() {

+ 7
- 9
android/app/src/main/java/com/reactnativenavigation/layouts/SingleScreenLayout.java Ver arquivo

@@ -2,7 +2,7 @@ package com.reactnativenavigation.layouts;
2 2
 
3 3
 import android.support.v7.app.AppCompatActivity;
4 4
 import android.view.View;
5
-import android.widget.FrameLayout;
5
+import android.widget.RelativeLayout;
6 6
 
7 7
 import com.reactnativenavigation.params.ScreenParams;
8 8
 import com.reactnativenavigation.params.TitleBarButtonParams;
@@ -13,9 +13,7 @@ import com.reactnativenavigation.views.TitleBarBackButtonListener;
13 13
 
14 14
 import java.util.List;
15 15
 
16
-import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
17
-
18
-public class SingleScreenLayout extends FrameLayout implements Layout {
16
+public class SingleScreenLayout extends RelativeLayout implements Layout {
19 17
 
20 18
     private final AppCompatActivity activity;
21 19
     private final ScreenParams screenParams;
@@ -38,10 +36,10 @@ public class SingleScreenLayout extends FrameLayout implements Layout {
38 36
     private void createStack() {
39 37
         if (stack != null) {
40 38
             stack.destroy();
41
-            removeView(stack);
42 39
         }
43
-        stack = new ScreenStack(activity, screenParams, this);
44
-        addView(stack, new LayoutParams(MATCH_PARENT, MATCH_PARENT));
40
+        stack = new ScreenStack(activity, this, this);
41
+        LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
42
+        stack.pushInitialScreen(screenParams, lp);
45 43
     }
46 44
 
47 45
     @Override
@@ -57,12 +55,12 @@ public class SingleScreenLayout extends FrameLayout implements Layout {
57 55
     @Override
58 56
     public void destroy() {
59 57
         stack.destroy();
60
-        removeView(stack);
61 58
     }
62 59
 
63 60
     @Override
64 61
     public void push(ScreenParams params) {
65
-        stack.push(params);
62
+        LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
63
+        stack.push(params, lp);
66 64
     }
67 65
 
68 66
     @Override

+ 4
- 0
android/app/src/main/java/com/reactnativenavigation/screens/Screen.java Ver arquivo

@@ -162,6 +162,10 @@ public abstract class Screen extends RelativeLayout {
162 162
         }
163 163
     }
164 164
 
165
+    public void show() {
166
+        screenAnimator.show(screenParams.animateScreenTransitions);
167
+    }
168
+
165 169
     public void show(boolean animated) {
166 170
         screenAnimator.show(animated);
167 171
     }

+ 29
- 36
android/app/src/main/java/com/reactnativenavigation/screens/ScreenStack.java Ver arquivo

@@ -1,50 +1,44 @@
1 1
 package com.reactnativenavigation.screens;
2 2
 
3 3
 import android.support.v7.app.AppCompatActivity;
4
-import android.view.ViewManager;
5
-import android.widget.FrameLayout;
4
+import android.view.View;
5
+import android.widget.RelativeLayout;
6 6
 
7 7
 import com.reactnativenavigation.params.ScreenParams;
8 8
 import com.reactnativenavigation.params.StyleParams;
9 9
 import com.reactnativenavigation.params.TitleBarButtonParams;
10 10
 import com.reactnativenavigation.params.TitleBarLeftButtonParams;
11 11
 import com.reactnativenavigation.utils.Task;
12
-import com.reactnativenavigation.utils.ViewUtils;
13 12
 import com.reactnativenavigation.views.TitleBarBackButtonListener;
14 13
 
15 14
 import java.util.List;
16 15
 import java.util.Stack;
17 16
 
18
-import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
19
-
20
-// TODO there's really no reason for ScreenStack to extend FrameLayout. All screens can be added to parent.
21
-public class ScreenStack extends FrameLayout {
17
+public class ScreenStack {
22 18
 
23 19
     private final AppCompatActivity activity;
20
+    private RelativeLayout parent;
24 21
     private TitleBarBackButtonListener titleBarBackButtonListener;
25 22
     private Stack<Screen> stack = new Stack<>();
26
-    private final int bottomTabsHeight;
27 23
 
28 24
     public ScreenStack(AppCompatActivity activity,
29
-                       ScreenParams initialScreenParams,
25
+                       RelativeLayout parent,
30 26
                        TitleBarBackButtonListener titleBarBackButtonListener) {
31
-        super(activity);
32 27
         this.activity = activity;
28
+        this.parent = parent;
33 29
         this.titleBarBackButtonListener = titleBarBackButtonListener;
34
-        bottomTabsHeight = (int) ViewUtils.convertDpToPixel(56);
35
-        pushInitialScreen(initialScreenParams);
36 30
     }
37 31
 
38
-    private void pushInitialScreen(ScreenParams initialScreenParams) {
32
+    public void pushInitialScreen(ScreenParams initialScreenParams, RelativeLayout.LayoutParams params) {
39 33
         Screen initialScreen = ScreenFactory.create(activity, initialScreenParams, titleBarBackButtonListener);
40
-        addScreen(initialScreen);
41
-        initialScreen.show(initialScreenParams.animateScreenTransitions);
34
+        initialScreen.setVisibility(View.INVISIBLE);
35
+        addScreen(initialScreen, params);
42 36
     }
43 37
 
44
-    public void push(final ScreenParams params) {
38
+    public void push(final ScreenParams params, RelativeLayout.LayoutParams layoutParams) {
45 39
         Screen nextScreen = ScreenFactory.create(activity, params, titleBarBackButtonListener);
46 40
         final Screen previousScreen = stack.peek();
47
-        addScreen(nextScreen);
41
+        addScreen(nextScreen, layoutParams);
48 42
         nextScreen.show(params.animateScreenTransitions, new Runnable() {
49 43
             @Override
50 44
             public void run() {
@@ -53,19 +47,14 @@ public class ScreenStack extends FrameLayout {
53 47
         });
54 48
     }
55 49
 
56
-    private void addScreen(Screen screen) {
57
-        screen.setVisibility(INVISIBLE);
58
-        LayoutParams params = new LayoutParams(MATCH_PARENT, MATCH_PARENT);
59
-        if (screen.screenParams.styleParams.drawScreenAboveBottomTabs) {
60
-            params.setMargins(0, 0, 0, bottomTabsHeight);
61
-        }
62
-        addView(screen, params);
50
+    private void addScreen(Screen screen, RelativeLayout.LayoutParams layoutParams) {
51
+        parent.addView(screen, layoutParams);
63 52
         stack.push(screen);
64 53
     }
65 54
 
66 55
     private void removePreviousWithoutUnmount(Screen previous) {
67 56
         previous.preventUnmountOnDetachedFromWindow();
68
-        removeView(previous);
57
+        parent.removeView(previous);
69 58
     }
70 59
 
71 60
     public void pop(boolean animated) {
@@ -81,13 +70,17 @@ public class ScreenStack extends FrameLayout {
81 70
             @Override
82 71
             public void run() {
83 72
                 toRemove.ensureUnmountOnDetachedFromWindow();
84
-                removeView(toRemove);
73
+                parent.removeView(toRemove);
85 74
             }
86 75
         });
87 76
     }
88 77
 
78
+    public Screen peek() {
79
+        return stack.peek();
80
+    }
81
+
89 82
     private void readdPrevious(Screen previous) {
90
-        addView(previous, 0, new LayoutParams(MATCH_PARENT, MATCH_PARENT));
83
+        parent.addView(previous, 0);
91 84
         previous.preventMountAfterReattachedToWindow();
92 85
     }
93 86
 
@@ -100,17 +93,9 @@ public class ScreenStack extends FrameLayout {
100 93
     public void destroy() {
101 94
         for (Screen screen : stack) {
102 95
             screen.ensureUnmountOnDetachedFromWindow();
103
-            removeView(screen);
96
+            parent.removeView(screen);
104 97
         }
105 98
         stack.clear();
106
-        removeFromScreen();
107
-    }
108
-
109
-    private void removeFromScreen() {
110
-        ViewManager parent = (ViewManager) getParent();
111
-        if (parent != null) {
112
-            parent.removeView(this);
113
-        }
114 99
     }
115 100
 
116 101
     public int getStackSize() {
@@ -173,4 +158,12 @@ public class ScreenStack extends FrameLayout {
173 158
             }
174 159
         }
175 160
     }
161
+
162
+    public void showScreen() {
163
+        stack.peek().setVisibility(View.VISIBLE);
164
+    }
165
+
166
+    public void hideScreen() {
167
+        stack.peek().setVisibility(View.INVISIBLE);
168
+    }
176 169
 }