Browse Source

initial work on TabbedScreen

Rotem M 8 years ago
parent
commit
5d2532bc6f

+ 1
- 1
android/app/src/main/java/com/reactnativenavigation/layouts/ScreenFactory.java View File

@@ -7,7 +7,7 @@ import com.reactnativenavigation.params.ScreenParams;
7 7
 public class ScreenFactory {
8 8
     public static Screen create(Context context, ScreenParams screenParams) {
9 9
         if (screenParams.hasTopTabs()) {
10
-            throw new UnsupportedOperationException("Rotem do your magic here");
10
+            return new TabbedScreen(context, screenParams);
11 11
         } else {
12 12
             return new SingleScreen(context, screenParams);
13 13
         }

+ 1
- 1
android/app/src/main/java/com/reactnativenavigation/layouts/SingleScreen.java View File

@@ -19,7 +19,7 @@ public class SingleScreen extends Screen {
19 19
 
20 20
     @Override
21 21
     protected void createContent() {
22
-        contentView = new ContentView(getContext(), screenParams, this);
22
+        contentView = new ContentView(getContext(), screenParams.screenId, screenParams.passProps, screenParams.navigationParams, this);
23 23
         addView(contentView, addBelowTopBar());
24 24
         contentView.init();
25 25
     }

+ 206
- 0
android/app/src/main/java/com/reactnativenavigation/layouts/TabbedScreen.java View File

@@ -0,0 +1,206 @@
1
+package com.reactnativenavigation.layouts;
2
+
3
+import android.content.Context;
4
+import android.support.annotation.NonNull;
5
+import android.support.design.widget.TabLayout;
6
+import android.support.v4.view.PagerAdapter;
7
+import android.support.v4.view.ViewPager;
8
+import android.view.View;
9
+import android.view.ViewGroup;
10
+import android.widget.RelativeLayout;
11
+
12
+import com.reactnativenavigation.params.ScreenParams;
13
+import com.reactnativenavigation.params.TopTabParams;
14
+import com.reactnativenavigation.views.ContentView;
15
+
16
+import java.util.ArrayList;
17
+import java.util.List;
18
+
19
+import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
20
+
21
+public class TabbedScreen extends Screen {
22
+
23
+    private List<ContentView> contentViews = new ArrayList<>();
24
+    private ViewPager viewPager;
25
+    private ViewPagerAdapter viewPagerAdapter;
26
+
27
+    public  TabbedScreen(Context context, ScreenParams screenParams) {
28
+        super(context, screenParams);
29
+    }
30
+
31
+    @Override
32
+    protected void createContent() {
33
+        TabLayout tabLayout = topBar.initTabs();
34
+        viewPager = new ViewPager(getContext());
35
+        addView(viewPager);
36
+        viewPagerAdapter = new ViewPagerAdapter(getContext(), viewPager, contentViews);
37
+//        tabLayout.setupWithViewPager(viewPager);
38
+
39
+        for (TopTabParams topTabParam : screenParams.topTabParams) {
40
+            ContentView contentView = new ContentView(getContext(), topTabParam.screenId, screenParams.passProps, screenParams.navigationParams, this);
41
+            viewPager.addView(contentView, addBelowTopBar());
42
+            contentView.init();
43
+
44
+            tabLayout.addTab(tabLayout.newTab().setText(topTabParam.title));
45
+//            viewPagerAdapter.addTabPage(topTabParam.title);
46
+        }
47
+
48
+    }
49
+
50
+    @NonNull
51
+    private LayoutParams addBelowTopBar() {
52
+        LayoutParams params = new LayoutParams(MATCH_PARENT, MATCH_PARENT);
53
+        if (!screenParams.styleParams.drawUnderTopBar) {
54
+            params.addRule(RelativeLayout.BELOW, topBar.getId());
55
+        }
56
+        return params;
57
+    }
58
+
59
+    @Override
60
+    public void ensureUnmountOnDetachedFromWindow() {
61
+        for (ContentView contentView: contentViews) {
62
+            contentView.ensureUnmountOnDetachedFromWindow();
63
+        }
64
+    }
65
+
66
+    @Override
67
+    public void preventUnmountOnDetachedFromWindow() {
68
+        for (ContentView contentView: contentViews) {
69
+            contentView.preventUnmountOnDetachedFromWindow();
70
+        }
71
+    }
72
+
73
+
74
+    public class ViewPagerAdapter extends PagerAdapter implements TabLayout.OnTabSelectedListener, ViewPager.OnPageChangeListener {
75
+
76
+        private static final String EVENT_ON_TAB_SELECTED = "OnTabSelected";
77
+
78
+        private ViewPager mViewPager;
79
+        //        private final ArrayList<ScreenStack> mScreenStacks;
80
+        private final ArrayList<String> mNavigatorIds;
81
+        private List<ContentView> contentViews;
82
+        //        private final Map<String, ScreenStack> mStackByNavigatorId;
83
+        private int mCurrentPage = 0;
84
+
85
+        public ViewPagerAdapter(Context context, ViewPager viewPager, List<ContentView> contentViews) {
86
+            this.mViewPager = viewPager;
87
+            this.contentViews = contentViews;
88
+//            mScreenStacks = new ArrayList<>();
89
+            this.mNavigatorIds = new ArrayList<>();
90
+//            mStackByNavigatorId = new HashMap<> ();
91
+//            for (ContentView contentView : contentViews) {
92
+//                ScreenStack stack = new ScreenStack(context);
93
+//                stack.push(screen);
94
+//                mScreenStacks.add(stack);
95
+//                mNavigatorIds.add(screen.navigatorId);
96
+//                mStackByNavigatorId.put(screen.navigatorId, stack);
97
+//            }
98
+        }
99
+
100
+//        public void push(Screen screen) {
101
+//            ScreenStack stack = mStackByNavigatorId.get(screen.navigatorId);
102
+//            Screen prevScreen = mScreenStacks.get(mCurrentPage).peek();
103
+//            mToolbar.setupToolbarButtonsAsync(prevScreen, screen);
104
+//            stack.push(screen);
105
+//        }
106
+//
107
+//        public Screen pop(String navigatorId) {
108
+//            ScreenStack stack = mStackByNavigatorId.get(navigatorId);
109
+//            Screen oldScreen =  stack != null ? stack.pop() : null;
110
+//            Screen newScreen = stack.peek();
111
+//            mToolbar.setupToolbarButtonsAsync(oldScreen, newScreen);
112
+//            return oldScreen;
113
+//        }
114
+//
115
+//        public Screen peek(String navigatorId) {
116
+//            ScreenStack stack = mStackByNavigatorId.get(navigatorId);
117
+//            return stack != null ? stack.peek() : null;
118
+//        }
119
+
120
+//        @Override
121
+//        public Object instantiateItem(ViewGroup container, int position) {
122
+//            ScreenStack view = mScreenStacks.get(position);
123
+//            container.addView(view);
124
+//            return view;
125
+//        }
126
+
127
+        @Override
128
+        public void destroyItem(ViewGroup container, int position, Object view) {
129
+            container.removeView((View) view);
130
+        }
131
+
132
+        @Override
133
+        public int getCount() {
134
+            return contentViews.size();
135
+        }
136
+
137
+        @Override
138
+        public boolean isViewFromObject(View view, Object object) {
139
+            return view == object;
140
+        }
141
+
142
+        @Override
143
+        public CharSequence getPageTitle(int position) {
144
+//            return contentViews.get(position).peek().label;
145
+            return "";
146
+        }
147
+
148
+        @Override
149
+        public void onTabSelected(TabLayout.Tab tab) {
150
+            // Set the viewPager's current item
151
+            int position = tab.getPosition();
152
+            mViewPager.setCurrentItem(position);
153
+
154
+//            // Set screen buttons
155
+//            Screen prevScreen = mScreenStacks.get(mCurrentPage).peek();
156
+//            Screen newScreen = mScreenStacks.get(position).peek();
157
+//            mToolbar.setupToolbarButtonsAsync(prevScreen, newScreen);
158
+//
159
+//            // Set title
160
+//            mToolbar.setTitle(newScreen.title == null ? "" : newScreen.title);
161
+//
162
+//            // Set navigation color
163
+//            StyleHelper.updateStyles(mToolbar, newScreen);
164
+//
165
+//            // Send tab selected event
166
+//            WritableMap params = Arguments.createMap();
167
+//            Screen screen = mScreenStacks.get(position).peek();
168
+//            RctManager.getInstance().sendEvent(EVENT_ON_TAB_SELECTED, screen, params);
169
+        }
170
+
171
+        @Override
172
+        public void onTabUnselected(TabLayout.Tab tab) {
173
+
174
+        }
175
+
176
+        @Override
177
+        public void onTabReselected(TabLayout.Tab tab) {
178
+
179
+        }
180
+
181
+        public String getNavigatorId(int position) {
182
+            return mNavigatorIds.get(position);
183
+        }
184
+
185
+        public int getStackSizeForNavigatorId(String activeNavigatorID) {
186
+//            return mStackByNavigatorId.get(activeNavigatorID).getStackSize();
187
+            return 0;
188
+        }
189
+
190
+
191
+        @Override
192
+        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
193
+
194
+        }
195
+
196
+        @Override
197
+        public void onPageSelected(int position) {
198
+            mCurrentPage = position;
199
+        }
200
+
201
+        @Override
202
+        public void onPageScrollStateChanged(int state) {
203
+
204
+        }
205
+    }
206
+}

+ 4
- 5
android/app/src/main/java/com/reactnativenavigation/views/ContentView.java View File

@@ -7,7 +7,6 @@ import android.view.View;
7 7
 import com.facebook.react.ReactInstanceManager;
8 8
 import com.facebook.react.ReactRootView;
9 9
 import com.reactnativenavigation.NavigationApplication;
10
-import com.reactnativenavigation.params.ScreenParams;
11 10
 import com.reactnativenavigation.react.ReactViewHacks;
12 11
 
13 12
 public class ContentView extends ReactRootView {
@@ -17,11 +16,11 @@ public class ContentView extends ReactRootView {
17 16
     private Bundle navigationParams;
18 17
     private ScrollViewAttacher scrollViewAttacher;
19 18
 
20
-    public ContentView(Context context, ScreenParams screenParams, ScrollDirectionListener.OnScrollChanged scrollListener) {
19
+    public ContentView(Context context, String screenId, Bundle passProps, Bundle navigationParams, ScrollDirectionListener.OnScrollChanged scrollListener) {
21 20
         super(context);
22
-        this.screenId = screenParams.screenId;
23
-        this.passProps = screenParams.passProps;
24
-        this.navigationParams = screenParams.navigationParams;
21
+        this.screenId = screenId;
22
+        this.passProps = passProps;
23
+        this.navigationParams = navigationParams;
25 24
         scrollViewAttacher = new ScrollViewAttacher(scrollListener);
26 25
     }
27 26
 

+ 8
- 0
android/app/src/main/java/com/reactnativenavigation/views/TopBar.java View File

@@ -2,6 +2,7 @@ package com.reactnativenavigation.views;
2 2
 
3 3
 import android.content.Context;
4 4
 import android.support.design.widget.AppBarLayout;
5
+import android.support.design.widget.TabLayout;
5 6
 
6 7
 import com.reactnativenavigation.params.ScreenStyleParams;
7 8
 import com.reactnativenavigation.params.TitleBarButtonParams;
@@ -12,6 +13,7 @@ import java.util.List;
12 13
 public class TopBar extends AppBarLayout {
13 14
 
14 15
     private TitleBar titleBar;
16
+    private TabLayout tabLayout;
15 17
 
16 18
     public TopBar(Context context) {
17 19
         super(context);
@@ -40,4 +42,10 @@ public class TopBar extends AppBarLayout {
40 42
     public void setTitleBarButtons(String navigatorEventId, List<TitleBarButtonParams> titleBarButtons) {
41 43
         titleBar.setButtons(titleBarButtons, navigatorEventId);
42 44
     }
45
+
46
+    public TabLayout initTabs() {
47
+        tabLayout = new TabLayout(getContext());
48
+        addView(tabLayout);
49
+        return tabLayout;
50
+    }
43 51
 }