Преглед изворни кода

Support pushing screens to unselected tabs

Guy Carmeli пре 8 година
родитељ
комит
fafc52a124

+ 28
- 8
android/app/src/main/java/com/reactnativenavigation/layouts/BottomTabsLayout.java Прегледај датотеку

52
         if (sideMenuParams == null) {
52
         if (sideMenuParams == null) {
53
             return;
53
             return;
54
         }
54
         }
55
-
56
         sideMenu = new SideMenu(getContext(), sideMenuParams);
55
         sideMenu = new SideMenu(getContext(), sideMenuParams);
57
         RelativeLayout.LayoutParams lp = new LayoutParams(MATCH_PARENT, MATCH_PARENT);
56
         RelativeLayout.LayoutParams lp = new LayoutParams(MATCH_PARENT, MATCH_PARENT);
58
         addView(sideMenu, lp);
57
         addView(sideMenu, lp);
65
     }
64
     }
66
 
65
 
67
     private void createAndAddScreens(int position) {
66
     private void createAndAddScreens(int position) {
68
-        ScreenStack newStack = new ScreenStack(activity, getContentContainer(), this);
69
         ScreenParams screenParams = params.tabParams.get(position);
67
         ScreenParams screenParams = params.tabParams.get(position);
68
+        ScreenStack newStack = new ScreenStack(activity, getContentContainer(), screenParams.navigatorId, this);
70
         newStack.pushInitialScreen(screenParams, createScreenLayoutParams(screenParams));
69
         newStack.pushInitialScreen(screenParams, createScreenLayoutParams(screenParams));
71
         screenStacks[position] = newStack;
70
         screenStacks[position] = newStack;
72
     }
71
     }
163
 
162
 
164
     @Override
163
     @Override
165
     public void push(ScreenParams screenParams) {
164
     public void push(ScreenParams screenParams) {
166
-        getCurrentScreenStack().push(screenParams, createScreenLayoutParams(screenParams));
167
-        bottomTabs.setStyleFromScreen(screenParams.styleParams);
165
+        ScreenStack screenStack = getScreenStack(screenParams.navigatorId);
166
+        if (screenStack == null) {
167
+            return;
168
+        }
169
+
170
+        if (isCurrentStack(screenStack)) {
171
+            screenStack.push(screenParams, createScreenLayoutParams(screenParams));
172
+            bottomTabs.setStyleFromScreen(screenParams.styleParams);
173
+        } else {
174
+            screenStack.push(screenParams, createScreenLayoutParams(screenParams));
175
+        }
168
     }
176
     }
169
 
177
 
170
     @Override
178
     @Override
189
         currentScreenStack.destroy();
197
         currentScreenStack.destroy();
190
         removeView(currentScreenStack.peek());
198
         removeView(currentScreenStack.peek());
191
 
199
 
192
-        ScreenStack newStack = new ScreenStack(activity, this, this);
200
+        ScreenStack newStack = new ScreenStack(activity, this, params.navigatorId, this);
193
         LayoutParams lp = createScreenLayoutParams(params);
201
         LayoutParams lp = createScreenLayoutParams(params);
194
         newStack.pushInitialScreen(params, lp);
202
         newStack.pushInitialScreen(params, lp);
195
         screenStacks[currentStackIndex] = newStack;
203
         screenStacks[currentStackIndex] = newStack;
220
     }
228
     }
221
 
229
 
222
     private void showStackAndUpdateStyle(ScreenStack newStack) {
230
     private void showStackAndUpdateStyle(ScreenStack newStack) {
223
-        newStack.showFirstScreen();
231
+        newStack.show();
224
         bottomTabs.setStyleFromScreen(newStack.getCurrentScreenStyleParams());
232
         bottomTabs.setStyleFromScreen(newStack.getCurrentScreenStyleParams());
225
     }
233
     }
226
 
234
 
227
     private void hideCurrentStack() {
235
     private void hideCurrentStack() {
228
         ScreenStack currentScreenStack = getCurrentScreenStack();
236
         ScreenStack currentScreenStack = getCurrentScreenStack();
229
-        currentScreenStack.hideScreen();
237
+        currentScreenStack.hide();
230
     }
238
     }
231
 
239
 
232
     private ScreenStack getCurrentScreenStack() {
240
     private ScreenStack getCurrentScreenStack() {
233
         return screenStacks[currentStackIndex];
241
         return screenStacks[currentStackIndex];
234
     }
242
     }
235
 
243
 
244
+    private @Nullable ScreenStack getScreenStack(String navigatorId) {
245
+        for (ScreenStack screenStack : screenStacks) {
246
+            if (screenStack.getNavigatorId().equals(navigatorId)) {
247
+                return screenStack;
248
+            }
249
+        }
250
+        return null;
251
+    }
252
+
253
+    private boolean isCurrentStack(ScreenStack screenStack) {
254
+        return getCurrentScreenStack() == screenStack;
255
+    }
256
+
236
     private void setBottomTabsStyleFromCurrentScreen() {
257
     private void setBottomTabsStyleFromCurrentScreen() {
237
         bottomTabs.setStyleFromScreen(getCurrentScreenStack().getCurrentScreenStyleParams());
258
         bottomTabs.setStyleFromScreen(getCurrentScreenStack().getCurrentScreenStyleParams());
238
     }
259
     }
248
             });
269
             });
249
             return true;
270
             return true;
250
         }
271
         }
251
-
252
         return false;
272
         return false;
253
     }
273
     }
254
 
274
 

+ 2
- 2
android/app/src/main/java/com/reactnativenavigation/layouts/SingleScreenLayout.java Прегледај датотеку

60
         if (stack != null) {
60
         if (stack != null) {
61
             stack.destroy();
61
             stack.destroy();
62
         }
62
         }
63
-        stack = new ScreenStack(activity, parent, this);
63
+        stack = new ScreenStack(activity, parent, screenParams.navigatorId, this);
64
         LayoutParams lp = new LayoutParams(MATCH_PARENT, MATCH_PARENT);
64
         LayoutParams lp = new LayoutParams(MATCH_PARENT, MATCH_PARENT);
65
         stack.pushInitialScreen(screenParams, lp);
65
         stack.pushInitialScreen(screenParams, lp);
66
-        stack.showFirstScreen();
66
+        stack.show();
67
     }
67
     }
68
 
68
 
69
     @Override
69
     @Override

+ 1
- 0
android/app/src/main/java/com/reactnativenavigation/params/ScreenParams.java Прегледај датотеку

21
 
21
 
22
     public String screenInstanceId;
22
     public String screenInstanceId;
23
     public String navigatorEventId;
23
     public String navigatorEventId;
24
+    public String navigatorId;
24
     public Bundle navigationParams;
25
     public Bundle navigationParams;
25
 
26
 
26
     public boolean hasTopTabs() {
27
     public boolean hasTopTabs() {

+ 2
- 0
android/app/src/main/java/com/reactnativenavigation/params/parsers/ScreenParamsParser.java Прегледај датотеку

17
     private static final String KEY_SCREEN_ID = "screenId";
17
     private static final String KEY_SCREEN_ID = "screenId";
18
     private static final String KEY_SCREEN_INSTANCE_ID = "screenInstanceID";
18
     private static final String KEY_SCREEN_INSTANCE_ID = "screenInstanceID";
19
     private static final String KEY_NAVIGATOR_EVENT_ID = "navigatorEventID";
19
     private static final String KEY_NAVIGATOR_EVENT_ID = "navigatorEventID";
20
+    private static final String KEY_NAVIGATOR_ID = "navigatorID";
20
     private static final String KEY_NAVIGATION_PARAMS = "navigationParams";
21
     private static final String KEY_NAVIGATION_PARAMS = "navigationParams";
21
     private static final String KEY_RIGHT_BUTTONS = "rightButtons";
22
     private static final String KEY_RIGHT_BUTTONS = "rightButtons";
22
     private static final String KEY_LEFT_BUTTON = "leftButton";
23
     private static final String KEY_LEFT_BUTTON = "leftButton";
34
         assertKeyExists(params, KEY_NAVIGATION_PARAMS);
35
         assertKeyExists(params, KEY_NAVIGATION_PARAMS);
35
         result.navigationParams = params.getBundle(KEY_NAVIGATION_PARAMS);
36
         result.navigationParams = params.getBundle(KEY_NAVIGATION_PARAMS);
36
         result.navigatorEventId = result.navigationParams.getString(KEY_NAVIGATOR_EVENT_ID);
37
         result.navigatorEventId = result.navigationParams.getString(KEY_NAVIGATOR_EVENT_ID);
38
+        result.navigatorId = result.navigationParams.getString(KEY_NAVIGATOR_ID);
37
         result.screenInstanceId = result.navigationParams.getString(KEY_SCREEN_INSTANCE_ID);
39
         result.screenInstanceId = result.navigationParams.getString(KEY_SCREEN_INSTANCE_ID);
38
 
40
 
39
         result.styleParams = new StyleParamsParser(params.getBundle(STYLE_PARAMS)).parse();
41
         result.styleParams = new StyleParamsParser(params.getBundle(STYLE_PARAMS)).parse();

+ 29
- 2
android/app/src/main/java/com/reactnativenavigation/screens/ScreenStack.java Прегледај датотеку

27
     private LeftButtonOnClickListener leftButtonOnClickListener;
27
     private LeftButtonOnClickListener leftButtonOnClickListener;
28
     private Stack<Screen> stack = new Stack<>();
28
     private Stack<Screen> stack = new Stack<>();
29
     private final KeyboardVisibilityDetector keyboardVisibilityDetector;
29
     private final KeyboardVisibilityDetector keyboardVisibilityDetector;
30
+    private boolean isStackVisible = false;
31
+    private final String navigatorId;
32
+
33
+    public String getNavigatorId() {
34
+        return navigatorId;
35
+    }
30
 
36
 
31
     public ScreenStack(AppCompatActivity activity,
37
     public ScreenStack(AppCompatActivity activity,
32
                        RelativeLayout parent,
38
                        RelativeLayout parent,
39
+                       String navigatorId,
33
                        LeftButtonOnClickListener leftButtonOnClickListener) {
40
                        LeftButtonOnClickListener leftButtonOnClickListener) {
34
         this.activity = activity;
41
         this.activity = activity;
35
         this.parent = parent;
42
         this.parent = parent;
43
+        this.navigatorId = navigatorId;
36
         this.leftButtonOnClickListener = leftButtonOnClickListener;
44
         this.leftButtonOnClickListener = leftButtonOnClickListener;
37
         keyboardVisibilityDetector = new KeyboardVisibilityDetector(parent);
45
         keyboardVisibilityDetector = new KeyboardVisibilityDetector(parent);
38
     }
46
     }
46
     public void push(final ScreenParams params, RelativeLayout.LayoutParams layoutParams) {
54
     public void push(final ScreenParams params, RelativeLayout.LayoutParams layoutParams) {
47
         Screen nextScreen = ScreenFactory.create(activity, params, leftButtonOnClickListener);
55
         Screen nextScreen = ScreenFactory.create(activity, params, leftButtonOnClickListener);
48
         final Screen previousScreen = stack.peek();
56
         final Screen previousScreen = stack.peek();
57
+        if (isStackVisible) {
58
+            pushScreenToVisibleStack(params, layoutParams, nextScreen, previousScreen);
59
+        } else {
60
+            pushScreenToInvisibleStack(layoutParams, nextScreen, previousScreen);
61
+        }
62
+    }
63
+
64
+    private void pushScreenToVisibleStack(ScreenParams params, RelativeLayout.LayoutParams layoutParams,
65
+                                          Screen nextScreen, final Screen previousScreen) {
49
         addScreen(nextScreen, layoutParams);
66
         addScreen(nextScreen, layoutParams);
50
         nextScreen.show(params.animateScreenTransitions, new Runnable() {
67
         nextScreen.show(params.animateScreenTransitions, new Runnable() {
51
             @Override
68
             @Override
55
         });
72
         });
56
     }
73
     }
57
 
74
 
75
+    private void pushScreenToInvisibleStack(RelativeLayout.LayoutParams layoutParams, Screen nextScreen,
76
+                                            Screen previousScreen) {
77
+        nextScreen.setVisibility(View.INVISIBLE);
78
+        addScreen(nextScreen, layoutParams);
79
+        removePreviousWithoutUnmount(previousScreen);
80
+    }
81
+
58
     private void addScreen(Screen screen, RelativeLayout.LayoutParams layoutParams) {
82
     private void addScreen(Screen screen, RelativeLayout.LayoutParams layoutParams) {
59
         parent.addView(screen, layoutParams);
83
         parent.addView(screen, layoutParams);
60
         stack.push(screen);
84
         stack.push(screen);
109
     }
133
     }
110
 
134
 
111
     private void readdPrevious(Screen previous) {
135
     private void readdPrevious(Screen previous) {
136
+        previous.setVisibility(View.VISIBLE);
112
         parent.addView(previous, 0);
137
         parent.addView(previous, 0);
113
         previous.preventMountAfterReattachedToWindow();
138
         previous.preventMountAfterReattachedToWindow();
114
     }
139
     }
188
         }
213
         }
189
     }
214
     }
190
 
215
 
191
-    public void showFirstScreen() {
216
+    public void show() {
217
+        isStackVisible = true;
192
         stack.peek().setVisibility(View.VISIBLE);
218
         stack.peek().setVisibility(View.VISIBLE);
193
     }
219
     }
194
 
220
 
195
-    public void hideScreen() {
221
+    public void hide() {
222
+        isStackVisible = false;
196
         stack.peek().setVisibility(View.INVISIBLE);
223
         stack.peek().setVisibility(View.INVISIBLE);
197
     }
224
     }
198
 }
225
 }