Browse Source

bottom tabs

Daniel Zlotin 7 years ago
parent
commit
55ee2d775c

+ 86
- 0
lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/BottomTabsController.java View File

@@ -0,0 +1,86 @@
1
+package com.reactnativenavigation.viewcontrollers;
2
+
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;
9
+import android.view.View;
10
+import android.widget.RelativeLayout;
11
+
12
+import com.reactnativenavigation.utils.CompatUtils;
13
+
14
+import java.util.List;
15
+
16
+import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
17
+import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
18
+import static android.widget.RelativeLayout.ABOVE;
19
+import static android.widget.RelativeLayout.ALIGN_PARENT_BOTTOM;
20
+
21
+public class BottomTabsController extends ViewController implements BottomNavigationView.OnNavigationItemSelectedListener {
22
+	private BottomNavigationView bottomNavigationView;
23
+	private int selectedIndex = 0;
24
+	private List<ViewController> tabs;
25
+
26
+	public BottomTabsController(final Activity activity, final String id) {
27
+		super(activity, id);
28
+	}
29
+
30
+	@NonNull
31
+	@Override
32
+	protected RelativeLayout createView() {
33
+		RelativeLayout root = new RelativeLayout(getActivity());
34
+		bottomNavigationView = new BottomNavigationView(getActivity());
35
+		bottomNavigationView.setId(CompatUtils.generateViewId());
36
+		bottomNavigationView.setBackgroundColor(Color.DKGRAY);
37
+		bottomNavigationView.setOnNavigationItemSelectedListener(this);
38
+		RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(MATCH_PARENT, WRAP_CONTENT);
39
+		lp.addRule(ALIGN_PARENT_BOTTOM);
40
+		bottomNavigationView.setLayoutParams(lp);
41
+		root.addView(bottomNavigationView, lp);
42
+		return root;
43
+	}
44
+
45
+	@NonNull
46
+	@Override
47
+	public RelativeLayout getView() {
48
+		return (RelativeLayout) super.getView();
49
+	}
50
+
51
+	@Override
52
+	public boolean onNavigationItemSelected(@NonNull final MenuItem item) {
53
+		selectedIndex = item.getItemId();
54
+		for (ViewController tab : tabs) {
55
+			tab.getView().setVisibility(View.GONE);
56
+		}
57
+		tabs.get(selectedIndex).getView().setVisibility(View.VISIBLE);
58
+		return true;
59
+	}
60
+
61
+	public void setTabs(final List<ViewController> tabs) {
62
+		if (tabs.size() > 5) {
63
+			throw new RuntimeException("Too many tabs!");
64
+		}
65
+		this.tabs = tabs;
66
+		getView();
67
+		for (int i = 0; i < tabs.size(); i++) {
68
+			ViewController tab = tabs.get(i);
69
+			bottomNavigationView.getMenu().add(0, i, Menu.NONE, String.valueOf(i));
70
+			RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT);
71
+			params.addRule(ABOVE, bottomNavigationView.getId());
72
+			getView().addView(tab.getView(), params);
73
+			if (i > 0) {
74
+				tab.getView().setVisibility(View.GONE);
75
+			}
76
+		}
77
+	}
78
+
79
+	public List<ViewController> getTabs() {
80
+		return tabs;
81
+	}
82
+
83
+	public int getSelectedIndex() {
84
+		return selectedIndex;
85
+	}
86
+}

+ 92
- 0
lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/BottomTabsControllerTest.java View File

@@ -0,0 +1,92 @@
1
+package com.reactnativenavigation.viewcontrollers;
2
+
3
+import android.app.Activity;
4
+import android.support.annotation.NonNull;
5
+import android.support.design.widget.BottomNavigationView;
6
+import android.view.MenuItem;
7
+import android.view.View;
8
+import android.widget.RelativeLayout;
9
+
10
+import com.reactnativenavigation.BaseTest;
11
+import com.reactnativenavigation.mocks.SimpleViewController;
12
+
13
+import org.junit.Test;
14
+
15
+import java.util.ArrayList;
16
+import java.util.List;
17
+
18
+import static org.assertj.core.api.Java6Assertions.assertThat;
19
+import static org.mockito.Mockito.mock;
20
+import static org.mockito.Mockito.when;
21
+
22
+public class BottomTabsControllerTest extends BaseTest {
23
+
24
+	private Activity activity;
25
+	private BottomTabsController uut;
26
+	private ViewController child1;
27
+	private ViewController child2;
28
+	private ViewController child3;
29
+
30
+	@Override
31
+	public void beforeEach() {
32
+		super.beforeEach();
33
+		activity = newActivity();
34
+		uut = new BottomTabsController(activity, "uut");
35
+		child1 = new SimpleViewController(activity, "child1");
36
+		child2 = new SimpleViewController(activity, "child2");
37
+		child3 = new SimpleViewController(activity, "child3");
38
+	}
39
+
40
+	@Test
41
+	public void containsRelativeLayoutView() throws Exception {
42
+		assertThat(uut.getView()).isInstanceOf(RelativeLayout.class);
43
+		assertThat(uut.getView().getChildAt(0)).isInstanceOf(BottomNavigationView.class);
44
+	}
45
+
46
+	@Test(expected = RuntimeException.class)
47
+	public void setTabs_ThrowWhenMoreThan5() throws Exception {
48
+		List<ViewController> tabs = createTabs();
49
+		tabs.add(new SimpleViewController(activity, "6"));
50
+		uut.setTabs(tabs);
51
+	}
52
+
53
+	@Test
54
+	public void setTabs_AddAllViewsAsGoneExceptFirst() throws Exception {
55
+		List<ViewController> tabs = createTabs();
56
+		uut.setTabs(tabs);
57
+		assertThat(uut.getView().getChildCount()).isEqualTo(6);
58
+		assertThat(uut.getView().getChildAt(1).getVisibility()).isEqualTo(View.VISIBLE);
59
+		assertThat(uut.getView().getChildAt(2).getVisibility()).isEqualTo(View.GONE);
60
+		assertThat(uut.getView().getChildAt(3).getVisibility()).isEqualTo(View.GONE);
61
+		assertThat(uut.getView().getChildAt(4).getVisibility()).isEqualTo(View.GONE);
62
+		assertThat(uut.getView().getChildAt(5).getVisibility()).isEqualTo(View.GONE);
63
+	}
64
+
65
+	@Test
66
+	public void onTabSelected_SelectsTab() throws Exception {
67
+		uut.setTabs(createTabs());
68
+		assertThat(uut.getSelectedIndex()).isZero();
69
+
70
+		MenuItem menuItem = mock(MenuItem.class);
71
+		when(menuItem.getItemId()).thenReturn(3);
72
+		assertThat(uut.onNavigationItemSelected(menuItem)).isTrue();
73
+
74
+		assertThat(uut.getSelectedIndex()).isEqualTo(3);
75
+		assertThat(uut.getTabs().get(0).getView().getVisibility()).isEqualTo(View.GONE);
76
+		assertThat(uut.getTabs().get(1).getView().getVisibility()).isEqualTo(View.GONE);
77
+		assertThat(uut.getTabs().get(2).getView().getVisibility()).isEqualTo(View.GONE);
78
+		assertThat(uut.getTabs().get(3).getView().getVisibility()).isEqualTo(View.VISIBLE);
79
+		assertThat(uut.getTabs().get(4).getView().getVisibility()).isEqualTo(View.GONE);
80
+	}
81
+
82
+	@NonNull
83
+	private List<ViewController> createTabs() {
84
+		List<ViewController> tabs = new ArrayList<>();
85
+		tabs.add(new SimpleViewController(activity, "1"));
86
+		tabs.add(new SimpleViewController(activity, "2"));
87
+		tabs.add(new SimpleViewController(activity, "3"));
88
+		tabs.add(new SimpleViewController(activity, "4"));
89
+		tabs.add(new SimpleViewController(activity, "5"));
90
+		return tabs;
91
+	}
92
+}