Sfoglia il codice sorgente

Implement SideMenu in SingleScreenLayout

Guy Carmeli 8 anni fa
parent
commit
12374aa32a

+ 1
- 1
android/app/src/main/java/com/reactnativenavigation/layouts/LayoutFactory.java Vedi File

@@ -16,7 +16,7 @@ public class LayoutFactory {
16 16
     }
17 17
 
18 18
     private static Layout createSingleScreenLayout(AppCompatActivity activity, ActivityParams params) {
19
-        return new SingleScreenLayout(activity, params.screenParams);
19
+        return new SingleScreenLayout(activity, params.sideMenuParams, params.screenParams);
20 20
     }
21 21
 
22 22
     private static Layout createBottomTabsScreenLayout(AppCompatActivity activity, ActivityParams params) {

+ 34
- 11
android/app/src/main/java/com/reactnativenavigation/layouts/SingleScreenLayout.java Vedi File

@@ -1,44 +1,66 @@
1 1
 package com.reactnativenavigation.layouts;
2 2
 
3
+import android.support.annotation.Nullable;
3 4
 import android.support.v7.app.AppCompatActivity;
4 5
 import android.view.View;
5 6
 import android.widget.RelativeLayout;
6 7
 
7 8
 import com.reactnativenavigation.params.ScreenParams;
9
+import com.reactnativenavigation.params.SideMenuParams;
8 10
 import com.reactnativenavigation.params.TitleBarButtonParams;
9 11
 import com.reactnativenavigation.params.TitleBarLeftButtonParams;
10
-import com.reactnativenavigation.screens.ScreenAnimator;
11 12
 import com.reactnativenavigation.screens.ScreenStack;
13
+import com.reactnativenavigation.views.SideMenu;
12 14
 import com.reactnativenavigation.views.TitleBarBackButtonListener;
13 15
 
14 16
 import java.util.List;
15 17
 
18
+import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
19
+
16 20
 public class SingleScreenLayout extends RelativeLayout implements Layout {
17 21
 
18 22
     private final AppCompatActivity activity;
19 23
     private final ScreenParams screenParams;
24
+    private final SideMenuParams sideMenuParams;
20 25
     private ScreenStack stack;
21
-    private ScreenAnimator screenAnimator;
22 26
     private TitleBarBackButtonListener titleBarBackButtonListener;
27
+    private SideMenu sideMenu;
23 28
 
24
-    public SingleScreenLayout(AppCompatActivity activity, ScreenParams screenParams, TitleBarBackButtonListener titleBarBackButtonListener) {
25
-        this(activity, screenParams);
29
+    public SingleScreenLayout(AppCompatActivity activity, ScreenParams screenParams,
30
+                              TitleBarBackButtonListener titleBarBackButtonListener) {
31
+        this(activity, null, screenParams);
26 32
         this.titleBarBackButtonListener = titleBarBackButtonListener;
27 33
     }
28 34
 
29
-    public SingleScreenLayout(AppCompatActivity activity, ScreenParams screenParams) {
35
+    public SingleScreenLayout(AppCompatActivity activity, @Nullable SideMenuParams sideMenuParams, ScreenParams screenParams) {
30 36
         super(activity);
31 37
         this.activity = activity;
32 38
         this.screenParams = screenParams;
33
-        createStack();
39
+        this.sideMenuParams = sideMenuParams;
40
+        createLayout();
41
+    }
42
+
43
+    private void createLayout() {
44
+        if (sideMenuParams == null) {
45
+            createStack(this);
46
+        } else {
47
+            createSideMenu();
48
+            createStack(sideMenu.getContentContainer());
49
+        }
50
+    }
51
+
52
+    private void createSideMenu() {
53
+        sideMenu = new SideMenu(getContext(), sideMenuParams);
54
+        RelativeLayout.LayoutParams lp = new LayoutParams(MATCH_PARENT, MATCH_PARENT);
55
+        addView(sideMenu, lp);
34 56
     }
35 57
 
36
-    private void createStack() {
58
+    private void createStack(RelativeLayout parent) {
37 59
         if (stack != null) {
38 60
             stack.destroy();
39 61
         }
40
-        stack = new ScreenStack(activity, this, this);
41
-        LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
62
+        stack = new ScreenStack(activity, parent, this);
63
+        LayoutParams lp = new LayoutParams(MATCH_PARENT, MATCH_PARENT);
42 64
         stack.pushInitialScreen(screenParams, lp);
43 65
         stack.showFirstScreen();
44 66
     }
@@ -60,7 +82,7 @@ public class SingleScreenLayout extends RelativeLayout implements Layout {
60 82
 
61 83
     @Override
62 84
     public void push(ScreenParams params) {
63
-        LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
85
+        LayoutParams lp = new LayoutParams(MATCH_PARENT, MATCH_PARENT);
64 86
         stack.push(params, lp);
65 87
     }
66 88
 
@@ -76,7 +98,8 @@ public class SingleScreenLayout extends RelativeLayout implements Layout {
76 98
 
77 99
     @Override
78 100
     public void newStack(ScreenParams params) {
79
-        createStack();
101
+        RelativeLayout parent = sideMenuParams == null ? this : sideMenu.getContentContainer();
102
+        createStack(parent);
80 103
     }
81 104
 
82 105
     @Override

+ 1
- 0
android/app/src/main/java/com/reactnativenavigation/params/ActivityParams.java Vedi File

@@ -10,4 +10,5 @@ public class ActivityParams {
10 10
     public Type type;
11 11
     public ScreenParams screenParams;
12 12
     public List<ScreenParams> tabParams;
13
+    public SideMenuParams sideMenuParams;
13 14
 }

+ 9
- 0
android/app/src/main/java/com/reactnativenavigation/params/SideMenuParams.java Vedi File

@@ -0,0 +1,9 @@
1
+package com.reactnativenavigation.params;
2
+
3
+import android.os.Bundle;
4
+
5
+public class SideMenuParams {
6
+    public String screenId;
7
+    public Bundle navigationParams;
8
+    public boolean disableOpenGesture;
9
+}

+ 4
- 0
android/app/src/main/java/com/reactnativenavigation/params/parsers/ActivityParamsParser.java Vedi File

@@ -21,6 +21,10 @@ public class ActivityParamsParser extends Parser {
21 21
             result.tabParams = ScreenParamsParser.parseTabs(params.getBundle("tabs"));
22 22
         }
23 23
 
24
+        if (hasKey(params, "sideMenu")) {
25
+            result.sideMenuParams = SideMenuParamsParser.parse(params.getBundle("sideMenu"));
26
+        }
27
+
24 28
         return result;
25 29
     }
26 30
 }

+ 15
- 0
android/app/src/main/java/com/reactnativenavigation/params/parsers/SideMenuParamsParser.java Vedi File

@@ -0,0 +1,15 @@
1
+package com.reactnativenavigation.params.parsers;
2
+
3
+import android.os.Bundle;
4
+
5
+import com.reactnativenavigation.params.SideMenuParams;
6
+
7
+public class SideMenuParamsParser extends Parser {
8
+
9
+    public static SideMenuParams parse(Bundle sideMenu) {
10
+        SideMenuParams result = new SideMenuParams();
11
+        result.screenId = sideMenu.getString("screenId");
12
+        result.disableOpenGesture = sideMenu.getBoolean("disableOpenGesture", false);
13
+        return result;
14
+    }
15
+}

+ 0
- 1
android/app/src/main/java/com/reactnativenavigation/screens/FragmentScreen.java Vedi File

@@ -40,7 +40,6 @@ public class FragmentScreen extends Screen {
40 40
     private void addContent() {
41 41
         ContentView contentView = new ContentView(getContext(),
42 42
                 screenParams.screenId,
43
-                screenParams.navigatorEventId,
44 43
                 screenParams.navigationParams);
45 44
         addView(contentView, 0, 0);
46 45
         LayoutParams params = new LayoutParams(MATCH_PARENT, MATCH_PARENT);

+ 1
- 1
android/app/src/main/java/com/reactnativenavigation/screens/SingleScreen.java Vedi File

@@ -19,7 +19,7 @@ public class SingleScreen extends Screen {
19 19
 
20 20
     @Override
21 21
     protected void createContent() {
22
-        contentView = new ContentView(getContext(), screenParams.screenId, screenParams.navigatorEventId, screenParams.navigationParams);
22
+        contentView = new ContentView(getContext(), screenParams.screenId, screenParams.navigationParams);
23 23
         LayoutParams params = new LayoutParams(MATCH_PARENT, MATCH_PARENT);
24 24
         if (screenParams.styleParams.drawScreenBelowTopBar) {
25 25
             params.addRule(BELOW, topBar.getId());

+ 1
- 1
android/app/src/main/java/com/reactnativenavigation/screens/ViewPagerScreen.java Vedi File

@@ -45,7 +45,7 @@ public class ViewPagerScreen extends Screen {
45 45
     private void addPages() {
46 46
         contentViews = new ArrayList<>();
47 47
         for (TopTabParams tab : screenParams.topTabParams) {
48
-            ContentView contentView = new ContentView(getContext(), tab.screenId, screenParams.navigatorEventId, tab.navigationParams);
48
+            ContentView contentView = new ContentView(getContext(), tab.screenId, tab.navigationParams, screenParams.navigatorEventId);
49 49
             addContent(contentView);
50 50
             contentViews.add(contentView);
51 51
         }

+ 6
- 2
android/app/src/main/java/com/reactnativenavigation/views/ContentView.java Vedi File

@@ -10,10 +10,14 @@ import com.reactnativenavigation.react.ReactViewHacks;
10 10
 public class ContentView extends ReactRootView {
11 11
 
12 12
     private final String screenId;
13
-    private final String navigatorEventId;
13
+    private String navigatorEventId;
14 14
     private final Bundle navigationParams;
15 15
 
16
-    public ContentView(Context context, String screenId, String navigatorEventId, Bundle navigationParams) {
16
+    public ContentView(Context context, String screenId, Bundle navigationParams) {
17
+        this(context, screenId, navigationParams, null);
18
+    }
19
+
20
+    public ContentView(Context context, String screenId, Bundle navigationParams, String navigatorEventId) {
17 21
         super(context);
18 22
         this.screenId = screenId;
19 23
         this.navigatorEventId = navigatorEventId;

+ 44
- 0
android/app/src/main/java/com/reactnativenavigation/views/SideMenu.java Vedi File

@@ -0,0 +1,44 @@
1
+package com.reactnativenavigation.views;
2
+
3
+import android.content.Context;
4
+import android.support.v4.widget.DrawerLayout;
5
+import android.view.Gravity;
6
+import android.view.ViewGroup;
7
+import android.widget.RelativeLayout;
8
+
9
+import com.reactnativenavigation.params.SideMenuParams;
10
+import com.reactnativenavigation.utils.ViewUtils;
11
+
12
+public class SideMenu extends DrawerLayout {
13
+
14
+    private ContentView sideMenuView;
15
+    private RelativeLayout contentContainer;
16
+
17
+    public RelativeLayout getContentContainer() {
18
+        return contentContainer;
19
+    }
20
+
21
+    public SideMenu(Context context, SideMenuParams sideMenuParams) {
22
+        super(context);
23
+        createContentContainer();
24
+        createSideMenu(sideMenuParams);
25
+    }
26
+
27
+    private void createContentContainer() {
28
+        LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
29
+        contentContainer = new RelativeLayout(getContext());
30
+        contentContainer.setId(ViewUtils.generateViewId());
31
+        addView(contentContainer, lp);
32
+    }
33
+
34
+    private void createSideMenu(SideMenuParams sideMenuParams) {
35
+        sideMenuView = new ContentView(getContext(),
36
+                sideMenuParams.screenId,
37
+                sideMenuParams.navigationParams);
38
+
39
+        DrawerLayout.LayoutParams lp =
40
+                new LayoutParams((int) ViewUtils.convertDpToPixel(240), ViewGroup.LayoutParams.MATCH_PARENT);
41
+        lp.gravity = Gravity.START;
42
+        addView(sideMenuView, lp);
43
+    }
44
+}

+ 15
- 20
src/deprecated/platformSpecificDeprecated.android.js Vedi File

@@ -19,8 +19,6 @@ function startSingleScreenApp(params) {
19 19
   addNavigationStyleParams(screen);
20 20
   screen.passProps = params.passProps;
21 21
 
22
-  //const drawer = setupDrawer(params.drawer);
23
-
24 22
   /*
25 23
    * adapt to new API
26 24
    */
@@ -29,6 +27,7 @@ function startSingleScreenApp(params) {
29 27
   params.screen = adaptNavigationStyleToScreenStyle(screen);
30 28
   params.screen = adaptNavigationParams(screen);
31 29
   params.appStyle = convertStyleParams(params.appStyle);
30
+  params.sideMenu = convertDrawerParamsToSideMenuParams(params.drawer);
32 31
 
33 32
   newPlatformSpecific.startApp(params);
34 33
 }
@@ -134,6 +133,20 @@ function convertStyleParams(originalStyleObject) {
134 133
   }
135 134
 }
136 135
 
136
+function convertDrawerParamsToSideMenuParams(drawerParams) {
137
+  const drawer = Object.assign({}, drawerParams);
138
+  if (!drawer.left || !drawer.left.screen) {
139
+    return null;
140
+  }
141
+
142
+  let result = {};
143
+  result.disableOpenGesture = drawer.disableOpenGesture !== undefined;
144
+  result.screenId = drawer.left.screen;
145
+  addNavigatorParams(result);
146
+
147
+  return result;
148
+}
149
+
137 150
 function adaptNavigationParams(screen) {
138 151
   screen.navigationParams = {
139 152
     screenInstanceID: screen.screenInstanceID,
@@ -350,24 +363,6 @@ function addNavigationStyleParams(screen) {
350 363
   screen.navigatorStyle = Object.assign({}, screen.navigatorStyle, Screen.navigatorStyle);
351 364
 }
352 365
 
353
-function setupDrawer(drawerParams) {
354
-  const drawer = Object.assign({}, drawerParams);
355
-  [drawer.left, drawer.right].forEach(side => {
356
-    if (!side) {
357
-      return;
358
-    }
359
-    const icon = resolveAssetSource(side.icon);
360
-    if (icon) {
361
-      side.icon = icon.uri;
362
-    }
363
-  });
364
-  if (drawer.disableOpenGesture === undefined) {
365
-    drawer.disableOpenGesture = false;
366
-  }
367
-
368
-  return drawer;
369
-}
370
-
371 366
 export default {
372 367
   startTabBasedApp,
373 368
   startSingleScreenApp,