Browse Source

A few improvements for Android (#3150)

1. Sideenus weren't clickable on Android. It seems the order in which
child views were being added to parent controllers, left or right
before center, were affecting the ability to interact with the menus.
I've changed the code to always add them in a specific order: center,
then left, then right.

I believe this closes issue #2835.

  https://github.com/wix/react-native-navigation/issues/2835.

2. On Android, merging options to open a menu works.

  Navigation.mergeOptions(currentComponentId, {
      sideMenu: {
          left: {
              visible: true
          }
      }
  })

But merging options to close it wasn't working.

  Navigation.mergeOptions(currentComponentId, {
      sideMenu: {
          left: {
              visible: false
          }
      }
  })

3. The bottom tabs controller was reserving a margin space for the tabs
when switching from one to another, regardless of its visibility
settings.
Rafael Viotti 6 years ago
parent
commit
f57099c0db

+ 28
- 7
lib/android/app/src/main/java/com/reactnativenavigation/parse/LayoutFactory.java View File

75
 	}
75
 	}
76
 
76
 
77
     private ViewController createSideMenuRoot(LayoutNode node) {
77
     private ViewController createSideMenuRoot(LayoutNode node) {
78
-        SideMenuController sideMenuController = new SideMenuController(activity, childRegistry, node.id, parseNodeOptions(node));
78
+		SideMenuController sideMenuController = new SideMenuController(activity, childRegistry, node.id, parseNodeOptions(node));
79
+		ViewController childControllerCenter = null, childControllerLeft = null, childControllerRight = null;
80
+
79
 		for (LayoutNode child : node.children) {
81
 		for (LayoutNode child : node.children) {
80
-			ViewController childController = create(child);
81
-            childController.setParentController(sideMenuController);
82
 			switch (child.type) {
82
 			switch (child.type) {
83
 				case SideMenuCenter:
83
 				case SideMenuCenter:
84
-					sideMenuController.setCenterController(childController);
84
+					childControllerCenter = create(child);
85
+					childControllerCenter.setParentController(sideMenuController);
85
 					break;
86
 					break;
86
 				case SideMenuLeft:
87
 				case SideMenuLeft:
87
-					sideMenuController.setLeftController(childController);
88
+					childControllerLeft = create(child);
89
+					childControllerLeft.setParentController(sideMenuController);
88
 					break;
90
 					break;
89
 				case SideMenuRight:
91
 				case SideMenuRight:
90
-					sideMenuController.setRightController(childController);
92
+					childControllerRight = create(child);
93
+					childControllerRight.setParentController(sideMenuController);
91
 					break;
94
 					break;
92
 				default:
95
 				default:
93
 					throw new IllegalArgumentException("Invalid node type in sideMenu: " + node.type);
96
 					throw new IllegalArgumentException("Invalid node type in sideMenu: " + node.type);
94
 			}
97
 			}
95
-        }
98
+		}
99
+
100
+		// Need to set the center controller first, otherwise "onPress" events on the JS components
101
+		// of the left and right drawers are not handled properly.
102
+		//
103
+		// See https://github.com/wix/react-native-navigation/issues/2835
104
+		//
105
+		if (childControllerCenter != null) {
106
+			sideMenuController.setCenterController(childControllerCenter);
107
+		}
108
+
109
+		if (childControllerLeft != null) {
110
+			sideMenuController.setLeftController(childControllerLeft);
111
+		}
112
+
113
+		if (childControllerRight != null) {
114
+			sideMenuController.setRightController(childControllerRight);
115
+		}
116
+
96
 		return sideMenuController;
117
 		return sideMenuController;
97
 	}
118
 	}
98
 
119
 

+ 3
- 1
lib/android/app/src/main/java/com/reactnativenavigation/presentation/BottomTabsOptionsPresenter.java View File

52
         if (options.drawBehind.isTrue()) {
52
         if (options.drawBehind.isTrue()) {
53
             lp.bottomMargin = 0;
53
             lp.bottomMargin = 0;
54
         }
54
         }
55
-        if (options.drawBehind.isFalseOrUndefined()) {
55
+
56
+        // Allocate space for the bottom tabs only if it is visible and it should not draw behind.
57
+        if (options.visible.isTrueOrUndefined() && options.drawBehind.isFalseOrUndefined()) {
56
             lp.bottomMargin = bottomTabs.getHeight();
58
             lp.bottomMargin = bottomTabs.getHeight();
57
         }
59
         }
58
 
60
 

+ 7
- 0
lib/android/app/src/main/java/com/reactnativenavigation/presentation/SideMenuOptionsPresenter.java View File

16
     public void present(SideMenuRootOptions options) {
16
     public void present(SideMenuRootOptions options) {
17
         if (options.left.visible.isTrue()) {
17
         if (options.left.visible.isTrue()) {
18
             sideMenu.openDrawer(Gravity.LEFT);
18
             sideMenu.openDrawer(Gravity.LEFT);
19
+
20
+        } else if (options.left.visible.isFalse() && sideMenu.isDrawerOpen(Gravity.LEFT)) {
21
+            sideMenu.closeDrawer(Gravity.LEFT);
19
         }
22
         }
23
+
20
         if (options.right.visible.isTrue()) {
24
         if (options.right.visible.isTrue()) {
21
             sideMenu.openDrawer(Gravity.RIGHT);
25
             sideMenu.openDrawer(Gravity.RIGHT);
26
+
27
+        } else if (options.right.visible.isFalse() && sideMenu.isDrawerOpen(Gravity.RIGHT)){
28
+            sideMenu.closeDrawer(Gravity.RIGHT);
22
         }
29
         }
23
     }
30
     }
24
 }
31
 }