ソースを参照

inlined bottom tabs

Daniel Zlotin 8 年 前
コミット
15a7ef8d65

+ 2
- 2
lib/android/app/src/main/java/com/reactnativenavigation/NavigationActivity.java ファイルの表示

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

+ 1
- 0
lib/android/app/src/main/java/com/reactnativenavigation/NavigationApplication.java ファイルの表示

4
 
4
 
5
 import com.facebook.react.ReactApplication;
5
 import com.facebook.react.ReactApplication;
6
 import com.facebook.react.ReactNativeHost;
6
 import com.facebook.react.ReactNativeHost;
7
+import com.reactnativenavigation.controllers.ActivityLifecycleDelegate;
7
 import com.reactnativenavigation.react.NavigationReactNativeHost;
8
 import com.reactnativenavigation.react.NavigationReactNativeHost;
8
 
9
 
9
 public abstract class NavigationApplication extends Application implements ReactApplication {
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 ファイルの表示

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

+ 4
- 4
lib/android/app/src/main/java/com/reactnativenavigation/layout/LayoutFactory.java ファイルの表示

4
 
4
 
5
 import com.facebook.react.ReactInstanceManager;
5
 import com.facebook.react.ReactInstanceManager;
6
 import com.reactnativenavigation.layout.containers.BottomTabsLayout;
6
 import com.reactnativenavigation.layout.containers.BottomTabsLayout;
7
-import com.reactnativenavigation.layout.containers.LayoutStack;
8
 import com.reactnativenavigation.layout.containers.RootLayout;
7
 import com.reactnativenavigation.layout.containers.RootLayout;
9
 import com.reactnativenavigation.layout.containers.SideMenuLayout;
8
 import com.reactnativenavigation.layout.containers.SideMenuLayout;
9
+import com.reactnativenavigation.layout.containers.StackLayout;
10
 
10
 
11
 public class LayoutFactory {
11
 public class LayoutFactory {
12
 
12
 
77
 	}
77
 	}
78
 
78
 
79
 	private Layout createContainerStack(LayoutNode node) {
79
 	private Layout createContainerStack(LayoutNode node) {
80
-		final LayoutStack layoutStack = new LayoutStack(activity);
80
+		final StackLayout layoutStack = new StackLayout(activity);
81
 		for (LayoutNode child : node.children) {
81
 		for (LayoutNode child : node.children) {
82
 			layoutStack.push(create(child));
82
 			layoutStack.push(create(child));
83
 		}
83
 		}
87
 	private Layout createBottomTabs(LayoutNode node) {
87
 	private Layout createBottomTabs(LayoutNode node) {
88
 		final BottomTabsLayout tabsContainer = new BottomTabsLayout(activity);
88
 		final BottomTabsLayout tabsContainer = new BottomTabsLayout(activity);
89
 		for (int i = 0; i < node.children.size(); i++) {
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
 		return tabsContainer;
93
 		return tabsContainer;
94
 	}
94
 	}

+ 0
- 65
lib/android/app/src/main/java/com/reactnativenavigation/layout/containers/BottomTabs.java ファイルの表示

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 ファイルの表示

1
 package com.reactnativenavigation.layout.containers;
1
 package com.reactnativenavigation.layout.containers;
2
 
2
 
3
 import android.app.Activity;
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
 import android.view.View;
9
 import android.view.View;
5
 import android.widget.RelativeLayout;
10
 import android.widget.RelativeLayout;
11
+import android.widget.RelativeLayout.LayoutParams;
6
 
12
 
7
 import com.reactnativenavigation.layout.Layout;
13
 import com.reactnativenavigation.layout.Layout;
8
 import com.reactnativenavigation.utils.CompatUtils;
14
 import com.reactnativenavigation.utils.CompatUtils;
10
 import java.util.ArrayList;
16
 import java.util.ArrayList;
11
 import java.util.List;
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
 import static android.widget.RelativeLayout.ABOVE;
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
 	public static class TooManyTabs extends RuntimeException {
26
 	public static class TooManyTabs extends RuntimeException {
27
+		//
18
 	}
28
 	}
19
 
29
 
20
 	private final RelativeLayout view;
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
 	private int currentTab;
33
 	private int currentTab;
24
 
34
 
25
 	public BottomTabsLayout(Activity activity) {
35
 	public BottomTabsLayout(Activity activity) {
26
 		view = new RelativeLayout(activity);
36
 		view = new RelativeLayout(activity);
27
 		view.setId(CompatUtils.generateViewId());
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
 	@Override
49
 	@Override
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
 	@Override
59
 	@Override
60
-	public void onTabSelected(int index) {
60
+	public boolean onNavigationItemSelected(@NonNull final MenuItem item) {
61
 		hideTab(currentTab);
61
 		hideTab(currentTab);
62
-		currentTab = index;
62
+		currentTab = item.getItemId();
63
 		showTab(currentTab);
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
 	private void showTab(int tabId) {
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
 	private void hideTab(int tabId) {
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 ファイルの表示

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

+ 3
- 3
lib/android/app/src/main/java/com/reactnativenavigation/react/NavigationModule.java ファイルの表示

9
 import com.reactnativenavigation.layout.Layout;
9
 import com.reactnativenavigation.layout.Layout;
10
 import com.reactnativenavigation.layout.LayoutFactory;
10
 import com.reactnativenavigation.layout.LayoutFactory;
11
 import com.reactnativenavigation.layout.LayoutNode;
11
 import com.reactnativenavigation.layout.LayoutNode;
12
-import com.reactnativenavigation.layout.containers.LayoutStack;
12
+import com.reactnativenavigation.layout.containers.StackLayout;
13
 import com.reactnativenavigation.parse.JSONParser;
13
 import com.reactnativenavigation.parse.JSONParser;
14
 import com.reactnativenavigation.parse.LayoutNodeParser;
14
 import com.reactnativenavigation.parse.LayoutNodeParser;
15
 import com.reactnativenavigation.utils.UiThread;
15
 import com.reactnativenavigation.utils.UiThread;
50
 				final LayoutNode layoutTree = LayoutNodeParser.parse(JSONParser.parse(rawLayoutTree));
50
 				final LayoutNode layoutTree = LayoutNodeParser.parse(JSONParser.parse(rawLayoutTree));
51
 				LayoutFactory factory = new LayoutFactory(activity(), reactInstanceManager);
51
 				LayoutFactory factory = new LayoutFactory(activity(), reactInstanceManager);
52
 				final Layout rootView = factory.create(layoutTree);
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
 		handle(new Runnable() {
60
 		handle(new Runnable() {
61
 			@Override
61
 			@Override
62
 			public void run() {
62
 			public void run() {
63
-				((LayoutStack) activity().getLayout()).pop();
63
+				((StackLayout) activity().getLayout()).pop();
64
 			}
64
 			}
65
 		});
65
 		});
66
 	}
66
 	}