소스 검색

Implement SideMenu in SingleScreenLayout

Guy Carmeli 8 년 전
부모
커밋
12374aa32a

+ 1
- 1
android/app/src/main/java/com/reactnativenavigation/layouts/LayoutFactory.java 파일 보기

16
     }
16
     }
17
 
17
 
18
     private static Layout createSingleScreenLayout(AppCompatActivity activity, ActivityParams params) {
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
     private static Layout createBottomTabsScreenLayout(AppCompatActivity activity, ActivityParams params) {
22
     private static Layout createBottomTabsScreenLayout(AppCompatActivity activity, ActivityParams params) {

+ 34
- 11
android/app/src/main/java/com/reactnativenavigation/layouts/SingleScreenLayout.java 파일 보기

1
 package com.reactnativenavigation.layouts;
1
 package com.reactnativenavigation.layouts;
2
 
2
 
3
+import android.support.annotation.Nullable;
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;
6
 
7
 
7
 import com.reactnativenavigation.params.ScreenParams;
8
 import com.reactnativenavigation.params.ScreenParams;
9
+import com.reactnativenavigation.params.SideMenuParams;
8
 import com.reactnativenavigation.params.TitleBarButtonParams;
10
 import com.reactnativenavigation.params.TitleBarButtonParams;
9
 import com.reactnativenavigation.params.TitleBarLeftButtonParams;
11
 import com.reactnativenavigation.params.TitleBarLeftButtonParams;
10
-import com.reactnativenavigation.screens.ScreenAnimator;
11
 import com.reactnativenavigation.screens.ScreenStack;
12
 import com.reactnativenavigation.screens.ScreenStack;
13
+import com.reactnativenavigation.views.SideMenu;
12
 import com.reactnativenavigation.views.TitleBarBackButtonListener;
14
 import com.reactnativenavigation.views.TitleBarBackButtonListener;
13
 
15
 
14
 import java.util.List;
16
 import java.util.List;
15
 
17
 
18
+import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
19
+
16
 public class SingleScreenLayout extends RelativeLayout implements Layout {
20
 public class SingleScreenLayout extends RelativeLayout implements Layout {
17
 
21
 
18
     private final AppCompatActivity activity;
22
     private final AppCompatActivity activity;
19
     private final ScreenParams screenParams;
23
     private final ScreenParams screenParams;
24
+    private final SideMenuParams sideMenuParams;
20
     private ScreenStack stack;
25
     private ScreenStack stack;
21
-    private ScreenAnimator screenAnimator;
22
     private TitleBarBackButtonListener titleBarBackButtonListener;
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
         this.titleBarBackButtonListener = titleBarBackButtonListener;
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
         super(activity);
36
         super(activity);
31
         this.activity = activity;
37
         this.activity = activity;
32
         this.screenParams = screenParams;
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
         if (stack != null) {
59
         if (stack != null) {
38
             stack.destroy();
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
         stack.pushInitialScreen(screenParams, lp);
64
         stack.pushInitialScreen(screenParams, lp);
43
         stack.showFirstScreen();
65
         stack.showFirstScreen();
44
     }
66
     }
60
 
82
 
61
     @Override
83
     @Override
62
     public void push(ScreenParams params) {
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
         stack.push(params, lp);
86
         stack.push(params, lp);
65
     }
87
     }
66
 
88
 
76
 
98
 
77
     @Override
99
     @Override
78
     public void newStack(ScreenParams params) {
100
     public void newStack(ScreenParams params) {
79
-        createStack();
101
+        RelativeLayout parent = sideMenuParams == null ? this : sideMenu.getContentContainer();
102
+        createStack(parent);
80
     }
103
     }
81
 
104
 
82
     @Override
105
     @Override

+ 1
- 0
android/app/src/main/java/com/reactnativenavigation/params/ActivityParams.java 파일 보기

10
     public Type type;
10
     public Type type;
11
     public ScreenParams screenParams;
11
     public ScreenParams screenParams;
12
     public List<ScreenParams> tabParams;
12
     public List<ScreenParams> tabParams;
13
+    public SideMenuParams sideMenuParams;
13
 }
14
 }

+ 9
- 0
android/app/src/main/java/com/reactnativenavigation/params/SideMenuParams.java 파일 보기

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 파일 보기

21
             result.tabParams = ScreenParamsParser.parseTabs(params.getBundle("tabs"));
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
         return result;
28
         return result;
25
     }
29
     }
26
 }
30
 }

+ 15
- 0
android/app/src/main/java/com/reactnativenavigation/params/parsers/SideMenuParamsParser.java 파일 보기

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 파일 보기

40
     private void addContent() {
40
     private void addContent() {
41
         ContentView contentView = new ContentView(getContext(),
41
         ContentView contentView = new ContentView(getContext(),
42
                 screenParams.screenId,
42
                 screenParams.screenId,
43
-                screenParams.navigatorEventId,
44
                 screenParams.navigationParams);
43
                 screenParams.navigationParams);
45
         addView(contentView, 0, 0);
44
         addView(contentView, 0, 0);
46
         LayoutParams params = new LayoutParams(MATCH_PARENT, MATCH_PARENT);
45
         LayoutParams params = new LayoutParams(MATCH_PARENT, MATCH_PARENT);

+ 1
- 1
android/app/src/main/java/com/reactnativenavigation/screens/SingleScreen.java 파일 보기

19
 
19
 
20
     @Override
20
     @Override
21
     protected void createContent() {
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
         LayoutParams params = new LayoutParams(MATCH_PARENT, MATCH_PARENT);
23
         LayoutParams params = new LayoutParams(MATCH_PARENT, MATCH_PARENT);
24
         if (screenParams.styleParams.drawScreenBelowTopBar) {
24
         if (screenParams.styleParams.drawScreenBelowTopBar) {
25
             params.addRule(BELOW, topBar.getId());
25
             params.addRule(BELOW, topBar.getId());

+ 1
- 1
android/app/src/main/java/com/reactnativenavigation/screens/ViewPagerScreen.java 파일 보기

45
     private void addPages() {
45
     private void addPages() {
46
         contentViews = new ArrayList<>();
46
         contentViews = new ArrayList<>();
47
         for (TopTabParams tab : screenParams.topTabParams) {
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
             addContent(contentView);
49
             addContent(contentView);
50
             contentViews.add(contentView);
50
             contentViews.add(contentView);
51
         }
51
         }

+ 6
- 2
android/app/src/main/java/com/reactnativenavigation/views/ContentView.java 파일 보기

10
 public class ContentView extends ReactRootView {
10
 public class ContentView extends ReactRootView {
11
 
11
 
12
     private final String screenId;
12
     private final String screenId;
13
-    private final String navigatorEventId;
13
+    private String navigatorEventId;
14
     private final Bundle navigationParams;
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
         super(context);
21
         super(context);
18
         this.screenId = screenId;
22
         this.screenId = screenId;
19
         this.navigatorEventId = navigatorEventId;
23
         this.navigatorEventId = navigatorEventId;

+ 44
- 0
android/app/src/main/java/com/reactnativenavigation/views/SideMenu.java 파일 보기

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 파일 보기

19
   addNavigationStyleParams(screen);
19
   addNavigationStyleParams(screen);
20
   screen.passProps = params.passProps;
20
   screen.passProps = params.passProps;
21
 
21
 
22
-  //const drawer = setupDrawer(params.drawer);
23
-
24
   /*
22
   /*
25
    * adapt to new API
23
    * adapt to new API
26
    */
24
    */
29
   params.screen = adaptNavigationStyleToScreenStyle(screen);
27
   params.screen = adaptNavigationStyleToScreenStyle(screen);
30
   params.screen = adaptNavigationParams(screen);
28
   params.screen = adaptNavigationParams(screen);
31
   params.appStyle = convertStyleParams(params.appStyle);
29
   params.appStyle = convertStyleParams(params.appStyle);
30
+  params.sideMenu = convertDrawerParamsToSideMenuParams(params.drawer);
32
 
31
 
33
   newPlatformSpecific.startApp(params);
32
   newPlatformSpecific.startApp(params);
34
 }
33
 }
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
 function adaptNavigationParams(screen) {
150
 function adaptNavigationParams(screen) {
138
   screen.navigationParams = {
151
   screen.navigationParams = {
139
     screenInstanceID: screen.screenInstanceID,
152
     screenInstanceID: screen.screenInstanceID,
350
   screen.navigatorStyle = Object.assign({}, screen.navigatorStyle, Screen.navigatorStyle);
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
 export default {
366
 export default {
372
   startTabBasedApp,
367
   startTabBasedApp,
373
   startSingleScreenApp,
368
   startSingleScreenApp,