Pārlūkot izejas kodu

Switch fab on ViewPager screen change

Guy Carmeli 8 gadus atpakaļ
vecāks
revīzija
cfaa8fef88

+ 6
- 4
android/app/src/main/java/com/reactnativenavigation/events/ScreenChangedEvent.java Parādīt failu

@@ -1,17 +1,19 @@
1 1
 package com.reactnativenavigation.events;
2 2
 
3
+import com.reactnativenavigation.params.FabParams;
3 4
 import com.reactnativenavigation.params.ScreenParams;
5
+import com.reactnativenavigation.params.TopTabParams;
4 6
 
5 7
 public class ScreenChangedEvent implements Event {
6 8
     public static final String TYPE = "ScreenChangedEvent";
7
-    private ScreenParams screenParams;
9
+    public FabParams fabParams;
8 10
 
9 11
     public ScreenChangedEvent(ScreenParams screenParams) {
10
-        this.screenParams = screenParams;
12
+        this.fabParams = screenParams.fabParams;
11 13
     }
12 14
 
13
-    public ScreenParams getScreenParams() {
14
-        return screenParams;
15
+    public ScreenChangedEvent(TopTabParams topTabParams) {
16
+        this.fabParams = topTabParams.fabParams;
15 17
     }
16 18
 
17 19
     @Override

+ 3
- 4
android/app/src/main/java/com/reactnativenavigation/layouts/SingleScreenLayout.java Parādīt failu

@@ -21,7 +21,6 @@ import com.reactnativenavigation.views.SnackbarAndFabContainer;
21 21
 import java.util.List;
22 22
 
23 23
 import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
24
-import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
25 24
 
26 25
 public class SingleScreenLayout extends RelativeLayout implements Layout {
27 26
 
@@ -48,7 +47,7 @@ public class SingleScreenLayout extends RelativeLayout implements Layout {
48 47
             sideMenu = createSideMenu();
49 48
             createStack(getScreenStackParent());
50 49
         }
51
-        createSnackbarContainer();
50
+        createFabAndSnackbarContainer();
52 51
     }
53 52
 
54 53
     private RelativeLayout getScreenStackParent() {
@@ -76,9 +75,9 @@ public class SingleScreenLayout extends RelativeLayout implements Layout {
76 75
         stack.show();
77 76
     }
78 77
 
79
-    private void createSnackbarContainer() {
78
+    private void createFabAndSnackbarContainer() {
80 79
         snackbarAndFabContainer = new SnackbarAndFabContainer(getContext());
81
-        RelativeLayout.LayoutParams lp = new LayoutParams(MATCH_PARENT, WRAP_CONTENT);
80
+        RelativeLayout.LayoutParams lp = new LayoutParams(MATCH_PARENT, MATCH_PARENT);
82 81
         lp.addRule(ALIGN_PARENT_BOTTOM);
83 82
         snackbarAndFabContainer.setLayoutParams(lp);
84 83
         getScreenStackParent().addView(snackbarAndFabContainer);

+ 5
- 0
android/app/src/main/java/com/reactnativenavigation/params/TopTabParams.java Parādīt failu

@@ -1,7 +1,12 @@
1 1
 package com.reactnativenavigation.params;
2 2
 
3
+import java.util.List;
4
+
3 5
 public class TopTabParams {
4 6
     public String screenId;
5 7
     public String title;
6 8
     public NavigationParams navigationParams;
9
+    public List<TitleBarButtonParams> rightButtons;
10
+    public TitleBarLeftButtonParams leftButton;
11
+    public FabParams fabParams;
7 12
 }

+ 45
- 0
android/app/src/main/java/com/reactnativenavigation/params/parsers/ButtonParser.java Parādīt failu

@@ -0,0 +1,45 @@
1
+package com.reactnativenavigation.params.parsers;
2
+
3
+import android.os.Bundle;
4
+
5
+import com.reactnativenavigation.params.FabParams;
6
+import com.reactnativenavigation.params.TitleBarButtonParams;
7
+import com.reactnativenavigation.params.TitleBarLeftButtonParams;
8
+
9
+import java.util.List;
10
+
11
+public class ButtonParser extends Parser {
12
+    private static final String KEY_RIGHT_BUTTONS = "rightButtons";
13
+    private static final String KEY_LEFT_BUTTON = "leftButton";
14
+    private static final String KEY_FAB = "fab";
15
+    private static final String KEY_BACK_BUTTON_HIDDEN = "backButtonHidden";
16
+
17
+    public static List<TitleBarButtonParams> parseRightButton(Bundle params) {
18
+        List<TitleBarButtonParams> rightButtons = null;
19
+        if (hasKey(params, KEY_RIGHT_BUTTONS)) {
20
+            rightButtons = new TitleBarButtonParamsParser().parseButtons(params.getBundle(KEY_RIGHT_BUTTONS));
21
+        }
22
+        return rightButtons;
23
+    }
24
+
25
+    public static TitleBarLeftButtonParams parseLeftButton(Bundle params) {
26
+        TitleBarLeftButtonParams leftButton = null;
27
+        if (hasKey(params, KEY_LEFT_BUTTON)) {
28
+            leftButton =  new TitleBarLeftButtonParamsParser().parseSingleButton(params.getBundle(KEY_LEFT_BUTTON));
29
+
30
+            boolean backButtonHidden = params.getBoolean(KEY_BACK_BUTTON_HIDDEN, false);
31
+            if (backButtonHidden && leftButton.isBackButton()) {
32
+                leftButton = null;
33
+            }
34
+        }
35
+        return leftButton;
36
+    }
37
+
38
+    public static FabParams parseFab(Bundle params) {
39
+        FabParams fabParams = null;
40
+        if (hasKey(params, KEY_FAB)) {
41
+            fabParams = new FabParamsParser().parse(params.getBundle(KEY_FAB));
42
+        }
43
+        return fabParams;
44
+    }
45
+}

+ 3
- 39
android/app/src/main/java/com/reactnativenavigation/params/parsers/ScreenParamsParser.java Parādīt failu

@@ -3,11 +3,8 @@ package com.reactnativenavigation.params.parsers;
3 3
 import android.graphics.drawable.Drawable;
4 4
 import android.os.Bundle;
5 5
 
6
-import com.reactnativenavigation.params.FabParams;
7 6
 import com.reactnativenavigation.params.NavigationParams;
8 7
 import com.reactnativenavigation.params.ScreenParams;
9
-import com.reactnativenavigation.params.TitleBarButtonParams;
10
-import com.reactnativenavigation.params.TitleBarLeftButtonParams;
11 8
 import com.reactnativenavigation.params.TopTabParams;
12 9
 import com.reactnativenavigation.react.ImageLoader;
13 10
 
@@ -17,10 +14,6 @@ public class ScreenParamsParser extends Parser {
17 14
     private static final String KEY_TITLE = "title";
18 15
     private static final String KEY_SCREEN_ID = "screenId";
19 16
     private static final String KEY_NAVIGATION_PARAMS = "navigationParams";
20
-    private static final String KEY_RIGHT_BUTTONS = "rightButtons";
21
-    private static final String KEY_LEFT_BUTTON = "leftButton";
22
-    private static final String KEY_FAB = "fab";
23
-    private static final String KEY_BACK_BUTTON_HIDDEN = "backButtonHidden";
24 17
     private static final String STYLE_PARAMS = "styleParams";
25 18
     private static final String TOP_TABS = "topTabs";
26 19
     private static final String FRAGMENT_CREATOR_CLASS_NAME = "fragmentCreatorClassName";
@@ -37,9 +30,9 @@ public class ScreenParamsParser extends Parser {
37 30
         result.styleParams = new StyleParamsParser(params.getBundle(STYLE_PARAMS)).parse();
38 31
 
39 32
         result.title = params.getString(KEY_TITLE);
40
-        result.rightButtons = parseRightButton(params);
33
+        result.rightButtons = ButtonParser.parseRightButton(params);
41 34
         result.overrideBackPressInJs = params.getBoolean(OVERRIDE_BACK_PRESS, false);
42
-        result.leftButton = parseLeftButton(params);
35
+        result.leftButton = ButtonParser.parseLeftButton(params);
43 36
 
44 37
         result.topTabParams = parseTopTabs(params);
45 38
 
@@ -48,7 +41,7 @@ public class ScreenParamsParser extends Parser {
48 41
             result.fragmentCreatorPassProps = params.getBundle(FRAGMENT_CREATOR_PASS_PROPS);
49 42
         }
50 43
 
51
-        result.fabParams = parseFab(params);
44
+        result.fabParams = ButtonParser.parseFab(params);
52 45
 
53 46
         result.tabLabel = getTabLabel(params);
54 47
         result.tabIcon = getTabIcon(params);
@@ -82,35 +75,6 @@ public class ScreenParamsParser extends Parser {
82 75
         return topTabParams;
83 76
     }
84 77
 
85
-    private static List<TitleBarButtonParams> parseRightButton(Bundle params) {
86
-        List<TitleBarButtonParams> rightButtons = null;
87
-        if (hasKey(params, KEY_RIGHT_BUTTONS)) {
88
-            rightButtons = new TitleBarButtonParamsParser().parseButtons(params.getBundle(KEY_RIGHT_BUTTONS));
89
-        }
90
-        return rightButtons;
91
-    }
92
-
93
-    private static TitleBarLeftButtonParams parseLeftButton(Bundle params) {
94
-        TitleBarLeftButtonParams leftButton = null;
95
-        if (hasKey(params, KEY_LEFT_BUTTON)) {
96
-            leftButton =  new TitleBarLeftButtonParamsParser().parseSingleButton(params.getBundle(KEY_LEFT_BUTTON));
97
-
98
-            boolean backButtonHidden = params.getBoolean(KEY_BACK_BUTTON_HIDDEN, false);
99
-            if (backButtonHidden && leftButton.isBackButton()) {
100
-                leftButton = null;
101
-            }
102
-        }
103
-        return leftButton;
104
-    }
105
-
106
-    private static FabParams parseFab(Bundle params) {
107
-        FabParams fabParams = null;
108
-        if (hasKey(params, KEY_FAB)) {
109
-            fabParams = new FabParamsParser().parse(params.getBundle(KEY_FAB));
110
-        }
111
-        return fabParams;
112
-    }
113
-
114 78
     public List<ScreenParams> parseTabs(Bundle params) {
115 79
         return parseBundle(params, new ParseStrategy<ScreenParams>() {
116 80
             @Override

+ 3
- 0
android/app/src/main/java/com/reactnativenavigation/params/parsers/TopTabParamsParser.java Parādīt failu

@@ -29,6 +29,9 @@ public class TopTabParamsParser extends Parser {
29 29
         result.screenId = params.getString(KEY_SCREEN_ID);
30 30
         result.title = params.getString(KEY_TITLE);
31 31
         result.navigationParams = new NavigationParams(params.getBundle(NAVIGATION_PARAMS));
32
+        result.leftButton = ButtonParser.parseLeftButton(params);
33
+        result.rightButtons = ButtonParser.parseRightButton(params);
34
+        result.fabParams = ButtonParser.parseFab(params);
32 35
         return result;
33 36
     }
34 37
 }

+ 24
- 22
android/app/src/main/java/com/reactnativenavigation/screens/ContentViewPagerAdapter.java Parādīt failu

@@ -1,6 +1,7 @@
1 1
 package com.reactnativenavigation.screens;
2 2
 
3 3
 import android.support.v4.view.PagerAdapter;
4
+import android.support.v4.view.ViewPager;
4 5
 import android.view.View;
5 6
 import android.view.ViewGroup;
6 7
 
@@ -14,8 +15,7 @@ import com.reactnativenavigation.views.ContentView;
14 15
 
15 16
 import java.util.List;
16 17
 
17
-public class ContentViewPagerAdapter extends PagerAdapter {
18
-
18
+public class ContentViewPagerAdapter extends PagerAdapter implements ViewPager.OnPageChangeListener {
19 19
     private List<ContentView> contentViews;
20 20
     private List<TopTabParams> topTabParams;
21 21
     private int currentPosition = 0;
@@ -31,38 +31,40 @@ public class ContentViewPagerAdapter extends PagerAdapter {
31 31
     }
32 32
 
33 33
     @Override
34
-    public void setPrimaryItem(ViewGroup container, int position, Object object) {
35
-        super.setPrimaryItem(container, position, object);
36
-        if (position != currentPosition) {
37
-            currentPosition = position;
38
-            sendScreenChangeBroadcast();
39
-            sendTabSelectedEventToJs();
40
-        }
34
+    public int getCount() {
35
+        return contentViews.size();
41 36
     }
42 37
 
43
-    private void sendScreenChangeBroadcast() {
44
-        // TODO Send navigatorParams to native. -guyca
45
-        EventBus.instance.post(new ScreenChangedEvent(null));
38
+    @Override
39
+    public boolean isViewFromObject(View view, Object object) {
40
+        return view == object;
46 41
     }
47 42
 
48
-    private void sendTabSelectedEventToJs() {
49
-        WritableMap data = Arguments.createMap();
50
-        String navigatorEventId = contentViews.get(currentPosition).getNavigatorEventId();
51
-        NavigationApplication.instance.sendNavigatorEvent("tabSelected", navigatorEventId, data);
43
+    @Override
44
+    public CharSequence getPageTitle(int position) {
45
+        return topTabParams.get(position).title;
52 46
     }
53 47
 
54 48
     @Override
55
-    public int getCount() {
56
-        return contentViews.size();
49
+    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
50
+
57 51
     }
58 52
 
59 53
     @Override
60
-    public boolean isViewFromObject(View view, Object object) {
61
-        return view == object;
54
+    public void onPageSelected(int position) {
55
+        currentPosition = position;
56
+        EventBus.instance.post(new ScreenChangedEvent(topTabParams.get(currentPosition)));
57
+        sendTabSelectedEventToJs();
62 58
     }
63 59
 
64 60
     @Override
65
-    public CharSequence getPageTitle(int position) {
66
-        return topTabParams.get(position).title;
61
+    public void onPageScrollStateChanged(int state) {
62
+
63
+    }
64
+
65
+    private void sendTabSelectedEventToJs() {
66
+        WritableMap data = Arguments.createMap();
67
+        String navigatorEventId = contentViews.get(currentPosition).getNavigatorEventId();
68
+        NavigationApplication.instance.sendNavigatorEvent("tabSelected", navigatorEventId, data);
67 69
     }
68 70
 }

+ 1
- 0
android/app/src/main/java/com/reactnativenavigation/screens/ViewPagerScreen.java Parādīt failu

@@ -54,6 +54,7 @@ public class ViewPagerScreen extends Screen {
54 54
     private void setupViewPager(TabLayout tabLayout) {
55 55
         ContentViewPagerAdapter adapter = new ContentViewPagerAdapter(contentViews, screenParams.topTabParams);
56 56
         viewPager.setAdapter(adapter);
57
+        viewPager.addOnPageChangeListener(adapter);
57 58
         tabLayout.setupWithViewPager(viewPager);
58 59
     }
59 60
 

+ 12
- 3
android/app/src/main/java/com/reactnativenavigation/views/FloatingActionButtonCoordinator.java Parādīt failu

@@ -6,6 +6,7 @@ import android.content.res.ColorStateList;
6 6
 import android.graphics.drawable.Drawable;
7 7
 import android.support.annotation.FloatRange;
8 8
 import android.support.annotation.NonNull;
9
+import android.support.annotation.Nullable;
9 10
 import android.support.design.widget.CoordinatorLayout;
10 11
 import android.support.design.widget.FloatingActionButton;
11 12
 import android.view.Gravity;
@@ -46,9 +47,15 @@ public class FloatingActionButtonCoordinator {
46 47
         show();
47 48
     }
48 49
 
49
-    public void remove(final Runnable onComplete) {
50
+    public void remove() {
51
+        remove(null);
52
+    }
53
+
54
+    public void remove(@Nullable final Runnable onComplete) {
50 55
         if (parent.getChildCount() == 0) {
51
-            onComplete.run();
56
+            if (onComplete != null) {
57
+                onComplete.run();
58
+            }
52 59
             return;
53 60
         }
54 61
 
@@ -56,7 +63,9 @@ public class FloatingActionButtonCoordinator {
56 63
             @Override
57 64
             public void onAnimationEnd(Animator animation) {
58 65
                 removeAllViews();
59
-                onComplete.run();
66
+                if (onComplete != null) {
67
+                    onComplete.run();
68
+                }
60 69
             }
61 70
         });
62 71
         removeFabFromScreen(collapsedFab, null);

+ 7
- 7
android/app/src/main/java/com/reactnativenavigation/views/SnackbarAndFabContainer.java Parādīt failu

@@ -7,7 +7,7 @@ import com.reactnativenavigation.events.Event;
7 7
 import com.reactnativenavigation.events.EventBus;
8 8
 import com.reactnativenavigation.events.ScreenChangedEvent;
9 9
 import com.reactnativenavigation.events.Subscriber;
10
-import com.reactnativenavigation.params.ScreenParams;
10
+import com.reactnativenavigation.params.FabParams;
11 11
 import com.reactnativenavigation.params.SnackbarParams;
12 12
 
13 13
 public class SnackbarAndFabContainer extends CoordinatorLayout implements Snakbar.OnDismissListener, Subscriber{
@@ -39,13 +39,13 @@ public class SnackbarAndFabContainer extends CoordinatorLayout implements Snakba
39 39
     @Override
40 40
     public void onEvent(Event event) {
41 41
         if (event.getType() == ScreenChangedEvent.TYPE) {
42
-            onScreenChange(((ScreenChangedEvent) event).getScreenParams());
42
+            onScreenChange(((ScreenChangedEvent) event).fabParams);
43 43
         }
44 44
     }
45 45
 
46
-    private void onScreenChange(ScreenParams screenParams) {
46
+    private void onScreenChange(FabParams fabParams) {
47 47
         dismissSnackbar();
48
-        updateFab(screenParams);
48
+        updateFab(fabParams);
49 49
     }
50 50
 
51 51
     private void dismissSnackbar() {
@@ -55,12 +55,12 @@ public class SnackbarAndFabContainer extends CoordinatorLayout implements Snakba
55 55
         }
56 56
     }
57 57
 
58
-    private void updateFab(final ScreenParams screenParams) {
58
+    private void updateFab(final FabParams fabParams) {
59 59
         fabCoordinator.remove(new Runnable() {
60 60
             @Override
61 61
             public void run() {
62
-                if (screenParams.fabParams != null) {
63
-                    fabCoordinator.add(screenParams.fabParams);
62
+                if (fabParams != null) {
63
+                    fabCoordinator.add(fabParams);
64 64
                 }
65 65
             }
66 66
         });

+ 2
- 0
src/deprecated/platformSpecificDeprecated.android.js Parādīt failu

@@ -40,6 +40,8 @@ function adaptTopTabs(screen, navigatorID) {
40 40
     if (navigatorID) {
41 41
       tab.navigatorID = navigatorID;
42 42
     }
43
+    tab.screen = tab.screenId;
44
+    addNavigatorButtons(tab);
43 45
     adaptNavigationParams(tab);
44 46
   });
45 47
 }