瀏覽代碼

Get screen LayoutParams from parent

Guy Carmeli 8 年之前
父節點
當前提交
36bcfd03de

+ 20
- 13
android/app/src/main/java/com/reactnativenavigation/layouts/BottomTabsLayout.java 查看文件

1
 package com.reactnativenavigation.layouts;
1
 package com.reactnativenavigation.layouts;
2
 
2
 
3
+import android.support.annotation.NonNull;
3
 import android.support.v7.app.AppCompatActivity;
4
 import android.support.v7.app.AppCompatActivity;
4
 import android.view.View;
5
 import android.view.View;
5
 import android.widget.RelativeLayout;
6
 import android.widget.RelativeLayout;
42
 
43
 
43
     private void addScreenStacks() {
44
     private void addScreenStacks() {
44
         for (int i = 0; i < screenStacks.length; i++) {
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
         screenStacks[position] = newStack;
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
     private void createBottomTabs() {
66
     private void createBottomTabs() {
122
 
128
 
123
     @Override
129
     @Override
124
     public void push(ScreenParams screenParams) {
130
     public void push(ScreenParams screenParams) {
125
-        getCurrentScreenStack().push(screenParams);
131
+        getCurrentScreenStack().push(screenParams, createScreenLayoutParams(screenParams));
126
         bottomTabs.setStyleFromScreen(screenParams.styleParams);
132
         bottomTabs.setStyleFromScreen(screenParams.styleParams);
127
     }
133
     }
128
 
134
 
142
     public void newStack(ScreenParams params) {
148
     public void newStack(ScreenParams params) {
143
         ScreenStack currentScreenStack = getCurrentScreenStack();
149
         ScreenStack currentScreenStack = getCurrentScreenStack();
144
         currentScreenStack.destroy();
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
         screenStacks[currentStackIndex] = newStack;
156
         screenStacks[currentStackIndex] = newStack;
149
-        addView(newStack, 0, new RelativeLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT));
150
 
157
 
151
         bottomTabs.setStyleFromScreen(params.styleParams);
158
         bottomTabs.setStyleFromScreen(params.styleParams);
152
     }
159
     }
170
     }
177
     }
171
 
178
 
172
     private void showStackAndUpdateStyle(ScreenStack newStack) {
179
     private void showStackAndUpdateStyle(ScreenStack newStack) {
173
-        newStack.setVisibility(VISIBLE);
180
+        newStack.showScreen();
174
         bottomTabs.setStyleFromScreen(newStack.getCurrentScreenStyleParams());
181
         bottomTabs.setStyleFromScreen(newStack.getCurrentScreenStyleParams());
175
     }
182
     }
176
 
183
 
177
     private void hideCurrentStack() {
184
     private void hideCurrentStack() {
178
         ScreenStack currentScreenStack = getCurrentScreenStack();
185
         ScreenStack currentScreenStack = getCurrentScreenStack();
179
-        currentScreenStack.setVisibility(INVISIBLE);
186
+        currentScreenStack.hideScreen();
180
     }
187
     }
181
 
188
 
182
     private ScreenStack getCurrentScreenStack() {
189
     private ScreenStack getCurrentScreenStack() {

+ 7
- 9
android/app/src/main/java/com/reactnativenavigation/layouts/SingleScreenLayout.java 查看文件

2
 
2
 
3
 import android.support.v7.app.AppCompatActivity;
3
 import android.support.v7.app.AppCompatActivity;
4
 import android.view.View;
4
 import android.view.View;
5
-import android.widget.FrameLayout;
5
+import android.widget.RelativeLayout;
6
 
6
 
7
 import com.reactnativenavigation.params.ScreenParams;
7
 import com.reactnativenavigation.params.ScreenParams;
8
 import com.reactnativenavigation.params.TitleBarButtonParams;
8
 import com.reactnativenavigation.params.TitleBarButtonParams;
13
 
13
 
14
 import java.util.List;
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
     private final AppCompatActivity activity;
18
     private final AppCompatActivity activity;
21
     private final ScreenParams screenParams;
19
     private final ScreenParams screenParams;
38
     private void createStack() {
36
     private void createStack() {
39
         if (stack != null) {
37
         if (stack != null) {
40
             stack.destroy();
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
     @Override
45
     @Override
57
     @Override
55
     @Override
58
     public void destroy() {
56
     public void destroy() {
59
         stack.destroy();
57
         stack.destroy();
60
-        removeView(stack);
61
     }
58
     }
62
 
59
 
63
     @Override
60
     @Override
64
     public void push(ScreenParams params) {
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
     @Override
66
     @Override

+ 4
- 0
android/app/src/main/java/com/reactnativenavigation/screens/Screen.java 查看文件

162
         }
162
         }
163
     }
163
     }
164
 
164
 
165
+    public void show() {
166
+        screenAnimator.show(screenParams.animateScreenTransitions);
167
+    }
168
+
165
     public void show(boolean animated) {
169
     public void show(boolean animated) {
166
         screenAnimator.show(animated);
170
         screenAnimator.show(animated);
167
     }
171
     }

+ 29
- 36
android/app/src/main/java/com/reactnativenavigation/screens/ScreenStack.java 查看文件

1
 package com.reactnativenavigation.screens;
1
 package com.reactnativenavigation.screens;
2
 
2
 
3
 import android.support.v7.app.AppCompatActivity;
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
 import com.reactnativenavigation.params.ScreenParams;
7
 import com.reactnativenavigation.params.ScreenParams;
8
 import com.reactnativenavigation.params.StyleParams;
8
 import com.reactnativenavigation.params.StyleParams;
9
 import com.reactnativenavigation.params.TitleBarButtonParams;
9
 import com.reactnativenavigation.params.TitleBarButtonParams;
10
 import com.reactnativenavigation.params.TitleBarLeftButtonParams;
10
 import com.reactnativenavigation.params.TitleBarLeftButtonParams;
11
 import com.reactnativenavigation.utils.Task;
11
 import com.reactnativenavigation.utils.Task;
12
-import com.reactnativenavigation.utils.ViewUtils;
13
 import com.reactnativenavigation.views.TitleBarBackButtonListener;
12
 import com.reactnativenavigation.views.TitleBarBackButtonListener;
14
 
13
 
15
 import java.util.List;
14
 import java.util.List;
16
 import java.util.Stack;
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
     private final AppCompatActivity activity;
19
     private final AppCompatActivity activity;
20
+    private RelativeLayout parent;
24
     private TitleBarBackButtonListener titleBarBackButtonListener;
21
     private TitleBarBackButtonListener titleBarBackButtonListener;
25
     private Stack<Screen> stack = new Stack<>();
22
     private Stack<Screen> stack = new Stack<>();
26
-    private final int bottomTabsHeight;
27
 
23
 
28
     public ScreenStack(AppCompatActivity activity,
24
     public ScreenStack(AppCompatActivity activity,
29
-                       ScreenParams initialScreenParams,
25
+                       RelativeLayout parent,
30
                        TitleBarBackButtonListener titleBarBackButtonListener) {
26
                        TitleBarBackButtonListener titleBarBackButtonListener) {
31
-        super(activity);
32
         this.activity = activity;
27
         this.activity = activity;
28
+        this.parent = parent;
33
         this.titleBarBackButtonListener = titleBarBackButtonListener;
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
         Screen initialScreen = ScreenFactory.create(activity, initialScreenParams, titleBarBackButtonListener);
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
         Screen nextScreen = ScreenFactory.create(activity, params, titleBarBackButtonListener);
39
         Screen nextScreen = ScreenFactory.create(activity, params, titleBarBackButtonListener);
46
         final Screen previousScreen = stack.peek();
40
         final Screen previousScreen = stack.peek();
47
-        addScreen(nextScreen);
41
+        addScreen(nextScreen, layoutParams);
48
         nextScreen.show(params.animateScreenTransitions, new Runnable() {
42
         nextScreen.show(params.animateScreenTransitions, new Runnable() {
49
             @Override
43
             @Override
50
             public void run() {
44
             public void run() {
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
         stack.push(screen);
52
         stack.push(screen);
64
     }
53
     }
65
 
54
 
66
     private void removePreviousWithoutUnmount(Screen previous) {
55
     private void removePreviousWithoutUnmount(Screen previous) {
67
         previous.preventUnmountOnDetachedFromWindow();
56
         previous.preventUnmountOnDetachedFromWindow();
68
-        removeView(previous);
57
+        parent.removeView(previous);
69
     }
58
     }
70
 
59
 
71
     public void pop(boolean animated) {
60
     public void pop(boolean animated) {
81
             @Override
70
             @Override
82
             public void run() {
71
             public void run() {
83
                 toRemove.ensureUnmountOnDetachedFromWindow();
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
     private void readdPrevious(Screen previous) {
82
     private void readdPrevious(Screen previous) {
90
-        addView(previous, 0, new LayoutParams(MATCH_PARENT, MATCH_PARENT));
83
+        parent.addView(previous, 0);
91
         previous.preventMountAfterReattachedToWindow();
84
         previous.preventMountAfterReattachedToWindow();
92
     }
85
     }
93
 
86
 
100
     public void destroy() {
93
     public void destroy() {
101
         for (Screen screen : stack) {
94
         for (Screen screen : stack) {
102
             screen.ensureUnmountOnDetachedFromWindow();
95
             screen.ensureUnmountOnDetachedFromWindow();
103
-            removeView(screen);
96
+            parent.removeView(screen);
104
         }
97
         }
105
         stack.clear();
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
     public int getStackSize() {
101
     public int getStackSize() {
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
 }