Browse Source

inlined bottom tabs

Daniel Zlotin 8 years ago
parent
commit
15a7ef8d65

+ 2
- 2
lib/android/app/src/main/java/com/reactnativenavigation/NavigationActivity.java View File

@@ -7,7 +7,7 @@ import android.view.View;
7 7
 
8 8
 import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;
9 9
 import com.reactnativenavigation.layout.Layout;
10
-import com.reactnativenavigation.layout.containers.LayoutStack;
10
+import com.reactnativenavigation.layout.containers.StackLayout;
11 11
 
12 12
 public class NavigationActivity extends AppCompatActivity implements DefaultHardwareBackBtnHandler {
13 13
 	private View contentView;
@@ -63,7 +63,7 @@ public class NavigationActivity extends AppCompatActivity implements DefaultHard
63 63
 
64 64
 	@Override
65 65
 	public void onBackPressed() {
66
-		if (layout instanceof LayoutStack && ((LayoutStack) layout).onBackPressed()) {
66
+		if (layout instanceof StackLayout && ((StackLayout) layout).onBackPressed()) {
67 67
 			// do nothing, layout pops
68 68
 		} else {
69 69
 			super.onBackPressed();

+ 1
- 0
lib/android/app/src/main/java/com/reactnativenavigation/NavigationApplication.java View File

@@ -4,6 +4,7 @@ import android.app.Application;
4 4
 
5 5
 import com.facebook.react.ReactApplication;
6 6
 import com.facebook.react.ReactNativeHost;
7
+import com.reactnativenavigation.controllers.ActivityLifecycleDelegate;
7 8
 import com.reactnativenavigation.react.NavigationReactNativeHost;
8 9
 
9 10
 public abstract class NavigationApplication extends Application implements ReactApplication {

lib/android/app/src/main/java/com/reactnativenavigation/ActivityLifecycleDelegate.java → lib/android/app/src/main/java/com/reactnativenavigation/controllers/ActivityLifecycleDelegate.java View File

@@ -1,7 +1,8 @@
1
-package com.reactnativenavigation;
1
+package com.reactnativenavigation.controllers;
2 2
 
3 3
 import com.facebook.react.ReactInstanceManager;
4 4
 import com.facebook.react.bridge.ReactContext;
5
+import com.reactnativenavigation.NavigationActivity;
5 6
 import com.reactnativenavigation.react.DevPermissionRequest;
6 7
 import com.reactnativenavigation.react.NavigationEventEmitter;
7 8
 

+ 4
- 4
lib/android/app/src/main/java/com/reactnativenavigation/layout/LayoutFactory.java View File

@@ -4,9 +4,9 @@ import android.app.Activity;
4 4
 
5 5
 import com.facebook.react.ReactInstanceManager;
6 6
 import com.reactnativenavigation.layout.containers.BottomTabsLayout;
7
-import com.reactnativenavigation.layout.containers.LayoutStack;
8 7
 import com.reactnativenavigation.layout.containers.RootLayout;
9 8
 import com.reactnativenavigation.layout.containers.SideMenuLayout;
9
+import com.reactnativenavigation.layout.containers.StackLayout;
10 10
 
11 11
 public class LayoutFactory {
12 12
 
@@ -77,7 +77,7 @@ public class LayoutFactory {
77 77
 	}
78 78
 
79 79
 	private Layout createContainerStack(LayoutNode node) {
80
-		final LayoutStack layoutStack = new LayoutStack(activity);
80
+		final StackLayout layoutStack = new StackLayout(activity);
81 81
 		for (LayoutNode child : node.children) {
82 82
 			layoutStack.push(create(child));
83 83
 		}
@@ -87,8 +87,8 @@ public class LayoutFactory {
87 87
 	private Layout createBottomTabs(LayoutNode node) {
88 88
 		final BottomTabsLayout tabsContainer = new BottomTabsLayout(activity);
89 89
 		for (int i = 0; i < node.children.size(); i++) {
90
-			final Layout tabContent = create(node.children.get(i));
91
-			tabsContainer.addTabContent("#" + i, tabContent);
90
+			final Layout tabLayout = create(node.children.get(i));
91
+			tabsContainer.addTab("#" + i, tabLayout);
92 92
 		}
93 93
 		return tabsContainer;
94 94
 	}

+ 0
- 65
lib/android/app/src/main/java/com/reactnativenavigation/layout/containers/BottomTabs.java View File

@@ -1,65 +0,0 @@
1
-package com.reactnativenavigation.layout.containers;
2
-
3
-import android.graphics.Color;
4
-import android.support.annotation.NonNull;
5
-import android.support.design.widget.BottomNavigationView;
6
-import android.view.Menu;
7
-import android.view.MenuItem;
8
-import android.widget.RelativeLayout;
9
-import android.widget.RelativeLayout.LayoutParams;
10
-
11
-import com.reactnativenavigation.utils.CompatUtils;
12
-
13
-import static android.widget.RelativeLayout.ALIGN_PARENT_BOTTOM;
14
-
15
-public class BottomTabs implements BottomNavigationView.OnNavigationItemSelectedListener {
16
-
17
-	interface BottomTabsSelectionListener {
18
-		void onTabSelected(int index);
19
-	}
20
-
21
-	private BottomNavigationView bottomNavigationView;
22
-	private BottomTabsSelectionListener listener;
23
-
24
-	public void attach(RelativeLayout parentLayout) {
25
-		createBottomNavigation(parentLayout);
26
-		addBottomNavigationToParent(parentLayout);
27
-	}
28
-
29
-	public void setSelectionListener(BottomTabsSelectionListener listener) {
30
-		this.listener = listener;
31
-	}
32
-
33
-	public void add(String label) {
34
-		int tabId = size();
35
-		bottomNavigationView.getMenu().add(0, tabId, Menu.NONE, label);
36
-	}
37
-
38
-	public int size() {
39
-		return bottomNavigationView.getMenu().size();
40
-	}
41
-
42
-	int getViewId() {
43
-		return bottomNavigationView.getId();
44
-	}
45
-
46
-	@Override
47
-	public boolean onNavigationItemSelected(@NonNull MenuItem item) {
48
-		listener.onTabSelected(item.getItemId());
49
-		return true;
50
-	}
51
-
52
-	private void createBottomNavigation(RelativeLayout parentLayout) {
53
-		bottomNavigationView = new BottomNavigationView(parentLayout.getContext());
54
-		bottomNavigationView.setId(CompatUtils.generateViewId());
55
-		bottomNavigationView.setBackgroundColor(Color.DKGRAY);
56
-		bottomNavigationView.setOnNavigationItemSelectedListener(this);
57
-	}
58
-
59
-	private void addBottomNavigationToParent(RelativeLayout parentLayout) {
60
-		LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
61
-		lp.addRule(ALIGN_PARENT_BOTTOM);
62
-		bottomNavigationView.setLayoutParams(lp);
63
-		parentLayout.addView(bottomNavigationView, lp);
64
-	}
65
-}

+ 40
- 29
lib/android/app/src/main/java/com/reactnativenavigation/layout/containers/BottomTabsLayout.java View File

@@ -1,8 +1,14 @@
1 1
 package com.reactnativenavigation.layout.containers;
2 2
 
3 3
 import android.app.Activity;
4
+import android.graphics.Color;
5
+import android.support.annotation.NonNull;
6
+import android.support.design.widget.BottomNavigationView;
7
+import android.view.Menu;
8
+import android.view.MenuItem;
4 9
 import android.view.View;
5 10
 import android.widget.RelativeLayout;
11
+import android.widget.RelativeLayout.LayoutParams;
6 12
 
7 13
 import com.reactnativenavigation.layout.Layout;
8 14
 import com.reactnativenavigation.utils.CompatUtils;
@@ -10,26 +16,34 @@ import com.reactnativenavigation.utils.CompatUtils;
10 16
 import java.util.ArrayList;
11 17
 import java.util.List;
12 18
 
19
+import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
20
+import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
13 21
 import static android.widget.RelativeLayout.ABOVE;
22
+import static android.widget.RelativeLayout.ALIGN_PARENT_BOTTOM;
14 23
 
15
-public class BottomTabsLayout implements Layout, BottomTabs.BottomTabsSelectionListener {
24
+public class BottomTabsLayout implements Layout, BottomNavigationView.OnNavigationItemSelectedListener {
16 25
 
17 26
 	public static class TooManyTabs extends RuntimeException {
27
+		//
18 28
 	}
19 29
 
20 30
 	private final RelativeLayout view;
21
-	private final BottomTabs bottomTabs;
22
-	private final List<View> tabContentViews = new ArrayList<>();
31
+	private final BottomNavigationView bottomNavigationView;
32
+	private final List<Layout> tabs = new ArrayList<>();
23 33
 	private int currentTab;
24 34
 
25 35
 	public BottomTabsLayout(Activity activity) {
26 36
 		view = new RelativeLayout(activity);
27 37
 		view.setId(CompatUtils.generateViewId());
28 38
 
29
-		//TODO inline everything. unneeded complexity
30
-		bottomTabs = new BottomTabs();
31
-		bottomTabs.attach(view);
32
-		bottomTabs.setSelectionListener(this);
39
+		bottomNavigationView = new BottomNavigationView(view.getContext());
40
+		bottomNavigationView.setId(CompatUtils.generateViewId());
41
+		bottomNavigationView.setBackgroundColor(Color.DKGRAY);
42
+		bottomNavigationView.setOnNavigationItemSelectedListener(this);
43
+		LayoutParams lp = new LayoutParams(MATCH_PARENT, WRAP_CONTENT);
44
+		lp.addRule(ALIGN_PARENT_BOTTOM);
45
+		bottomNavigationView.setLayoutParams(lp);
46
+		view.addView(bottomNavigationView, lp);
33 47
 	}
34 48
 
35 49
 	@Override
@@ -42,38 +56,35 @@ public class BottomTabsLayout implements Layout, BottomTabs.BottomTabsSelectionL
42 56
 		//
43 57
 	}
44 58
 
45
-
46
-	public void addTabContent(String label, Layout tabContent) {
47
-		if (tabContentViews.size() >= 5) {
48
-			throw new TooManyTabs();
49
-		}
50
-		bottomTabs.add(label);
51
-		attachTabContent(tabContent.getView());
52
-		tabContentViews.add(tabContent.getView());
53
-
54
-		if (tabContentViews.size() > 1) {
55
-			tabContent.getView().setVisibility(View.GONE);
56
-		}
57
-	}
58
-
59 59
 	@Override
60
-	public void onTabSelected(int index) {
60
+	public boolean onNavigationItemSelected(@NonNull final MenuItem item) {
61 61
 		hideTab(currentTab);
62
-		currentTab = index;
62
+		currentTab = item.getItemId();
63 63
 		showTab(currentTab);
64
+		return true;
64 65
 	}
65 66
 
66
-	private void attachTabContent(View tabContent) {
67
-		RelativeLayout.LayoutParams tabParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);
68
-		tabParams.addRule(ABOVE, bottomTabs.getViewId());
69
-		view.addView(tabContent, tabParams);
67
+	public void addTab(String label, Layout tabLayout) {
68
+		if (tabs.size() >= 5) {
69
+			throw new TooManyTabs();
70
+		}
71
+		int tabId = bottomNavigationView.getMenu().size();
72
+		bottomNavigationView.getMenu().add(0, tabId, Menu.NONE, label);
73
+		LayoutParams tabParams = new LayoutParams(MATCH_PARENT, MATCH_PARENT);
74
+		tabParams.addRule(ABOVE, bottomNavigationView.getId());
75
+		view.addView(tabLayout.getView(), tabParams);
76
+		tabs.add(tabLayout);
77
+
78
+		if (tabs.size() > 1) {
79
+			tabLayout.getView().setVisibility(View.GONE);
80
+		}
70 81
 	}
71 82
 
72 83
 	private void showTab(int tabId) {
73
-		tabContentViews.get(tabId).setVisibility(View.VISIBLE);
84
+		tabs.get(tabId).getView().setVisibility(View.VISIBLE);
74 85
 	}
75 86
 
76 87
 	private void hideTab(int tabId) {
77
-		tabContentViews.get(tabId).setVisibility(View.GONE);
88
+		tabs.get(tabId).getView().setVisibility(View.GONE);
78 89
 	}
79 90
 }

lib/android/app/src/main/java/com/reactnativenavigation/layout/containers/LayoutStack.java → lib/android/app/src/main/java/com/reactnativenavigation/layout/containers/StackLayout.java View File

@@ -9,12 +9,12 @@ import com.reactnativenavigation.utils.CompatUtils;
9 9
 
10 10
 import java.util.Stack;
11 11
 
12
-public class LayoutStack implements Layout {
12
+public class StackLayout implements Layout {
13 13
 
14 14
 	private final Stack<Layout> stack = new Stack<>();
15 15
 	private final FrameLayout view;
16 16
 
17
-	public LayoutStack(Context context) {
17
+	public StackLayout(Context context) {
18 18
 		view = new FrameLayout(context);
19 19
 		view.setId(CompatUtils.generateViewId());
20 20
 	}

+ 3
- 3
lib/android/app/src/main/java/com/reactnativenavigation/react/NavigationModule.java View File

@@ -9,7 +9,7 @@ import com.reactnativenavigation.NavigationActivity;
9 9
 import com.reactnativenavigation.layout.Layout;
10 10
 import com.reactnativenavigation.layout.LayoutFactory;
11 11
 import com.reactnativenavigation.layout.LayoutNode;
12
-import com.reactnativenavigation.layout.containers.LayoutStack;
12
+import com.reactnativenavigation.layout.containers.StackLayout;
13 13
 import com.reactnativenavigation.parse.JSONParser;
14 14
 import com.reactnativenavigation.parse.LayoutNodeParser;
15 15
 import com.reactnativenavigation.utils.UiThread;
@@ -50,7 +50,7 @@ public class NavigationModule extends ReactContextBaseJavaModule {
50 50
 				final LayoutNode layoutTree = LayoutNodeParser.parse(JSONParser.parse(rawLayoutTree));
51 51
 				LayoutFactory factory = new LayoutFactory(activity(), reactInstanceManager);
52 52
 				final Layout rootView = factory.create(layoutTree);
53
-				((LayoutStack) activity().getLayout()).push(rootView);
53
+				((StackLayout) activity().getLayout()).push(rootView);
54 54
 			}
55 55
 		});
56 56
 	}
@@ -60,7 +60,7 @@ public class NavigationModule extends ReactContextBaseJavaModule {
60 60
 		handle(new Runnable() {
61 61
 			@Override
62 62
 			public void run() {
63
-				((LayoutStack) activity().getLayout()).pop();
63
+				((StackLayout) activity().getLayout()).pop();
64 64
 			}
65 65
 		});
66 66
 	}