Sfoglia il codice sorgente

Switch fab on ViewPager screen change

Guy Carmeli 8 anni fa
parent
commit
cfaa8fef88

+ 6
- 4
android/app/src/main/java/com/reactnativenavigation/events/ScreenChangedEvent.java Vedi File

1
 package com.reactnativenavigation.events;
1
 package com.reactnativenavigation.events;
2
 
2
 
3
+import com.reactnativenavigation.params.FabParams;
3
 import com.reactnativenavigation.params.ScreenParams;
4
 import com.reactnativenavigation.params.ScreenParams;
5
+import com.reactnativenavigation.params.TopTabParams;
4
 
6
 
5
 public class ScreenChangedEvent implements Event {
7
 public class ScreenChangedEvent implements Event {
6
     public static final String TYPE = "ScreenChangedEvent";
8
     public static final String TYPE = "ScreenChangedEvent";
7
-    private ScreenParams screenParams;
9
+    public FabParams fabParams;
8
 
10
 
9
     public ScreenChangedEvent(ScreenParams screenParams) {
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
     @Override
19
     @Override

+ 3
- 4
android/app/src/main/java/com/reactnativenavigation/layouts/SingleScreenLayout.java Vedi File

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

+ 5
- 0
android/app/src/main/java/com/reactnativenavigation/params/TopTabParams.java Vedi File

1
 package com.reactnativenavigation.params;
1
 package com.reactnativenavigation.params;
2
 
2
 
3
+import java.util.List;
4
+
3
 public class TopTabParams {
5
 public class TopTabParams {
4
     public String screenId;
6
     public String screenId;
5
     public String title;
7
     public String title;
6
     public NavigationParams navigationParams;
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 Vedi File

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 Vedi File

3
 import android.graphics.drawable.Drawable;
3
 import android.graphics.drawable.Drawable;
4
 import android.os.Bundle;
4
 import android.os.Bundle;
5
 
5
 
6
-import com.reactnativenavigation.params.FabParams;
7
 import com.reactnativenavigation.params.NavigationParams;
6
 import com.reactnativenavigation.params.NavigationParams;
8
 import com.reactnativenavigation.params.ScreenParams;
7
 import com.reactnativenavigation.params.ScreenParams;
9
-import com.reactnativenavigation.params.TitleBarButtonParams;
10
-import com.reactnativenavigation.params.TitleBarLeftButtonParams;
11
 import com.reactnativenavigation.params.TopTabParams;
8
 import com.reactnativenavigation.params.TopTabParams;
12
 import com.reactnativenavigation.react.ImageLoader;
9
 import com.reactnativenavigation.react.ImageLoader;
13
 
10
 
17
     private static final String KEY_TITLE = "title";
14
     private static final String KEY_TITLE = "title";
18
     private static final String KEY_SCREEN_ID = "screenId";
15
     private static final String KEY_SCREEN_ID = "screenId";
19
     private static final String KEY_NAVIGATION_PARAMS = "navigationParams";
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
     private static final String STYLE_PARAMS = "styleParams";
17
     private static final String STYLE_PARAMS = "styleParams";
25
     private static final String TOP_TABS = "topTabs";
18
     private static final String TOP_TABS = "topTabs";
26
     private static final String FRAGMENT_CREATOR_CLASS_NAME = "fragmentCreatorClassName";
19
     private static final String FRAGMENT_CREATOR_CLASS_NAME = "fragmentCreatorClassName";
37
         result.styleParams = new StyleParamsParser(params.getBundle(STYLE_PARAMS)).parse();
30
         result.styleParams = new StyleParamsParser(params.getBundle(STYLE_PARAMS)).parse();
38
 
31
 
39
         result.title = params.getString(KEY_TITLE);
32
         result.title = params.getString(KEY_TITLE);
40
-        result.rightButtons = parseRightButton(params);
33
+        result.rightButtons = ButtonParser.parseRightButton(params);
41
         result.overrideBackPressInJs = params.getBoolean(OVERRIDE_BACK_PRESS, false);
34
         result.overrideBackPressInJs = params.getBoolean(OVERRIDE_BACK_PRESS, false);
42
-        result.leftButton = parseLeftButton(params);
35
+        result.leftButton = ButtonParser.parseLeftButton(params);
43
 
36
 
44
         result.topTabParams = parseTopTabs(params);
37
         result.topTabParams = parseTopTabs(params);
45
 
38
 
48
             result.fragmentCreatorPassProps = params.getBundle(FRAGMENT_CREATOR_PASS_PROPS);
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
         result.tabLabel = getTabLabel(params);
46
         result.tabLabel = getTabLabel(params);
54
         result.tabIcon = getTabIcon(params);
47
         result.tabIcon = getTabIcon(params);
82
         return topTabParams;
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
     public List<ScreenParams> parseTabs(Bundle params) {
78
     public List<ScreenParams> parseTabs(Bundle params) {
115
         return parseBundle(params, new ParseStrategy<ScreenParams>() {
79
         return parseBundle(params, new ParseStrategy<ScreenParams>() {
116
             @Override
80
             @Override

+ 3
- 0
android/app/src/main/java/com/reactnativenavigation/params/parsers/TopTabParamsParser.java Vedi File

29
         result.screenId = params.getString(KEY_SCREEN_ID);
29
         result.screenId = params.getString(KEY_SCREEN_ID);
30
         result.title = params.getString(KEY_TITLE);
30
         result.title = params.getString(KEY_TITLE);
31
         result.navigationParams = new NavigationParams(params.getBundle(NAVIGATION_PARAMS));
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
         return result;
35
         return result;
33
     }
36
     }
34
 }
37
 }

+ 24
- 22
android/app/src/main/java/com/reactnativenavigation/screens/ContentViewPagerAdapter.java Vedi File

1
 package com.reactnativenavigation.screens;
1
 package com.reactnativenavigation.screens;
2
 
2
 
3
 import android.support.v4.view.PagerAdapter;
3
 import android.support.v4.view.PagerAdapter;
4
+import android.support.v4.view.ViewPager;
4
 import android.view.View;
5
 import android.view.View;
5
 import android.view.ViewGroup;
6
 import android.view.ViewGroup;
6
 
7
 
14
 
15
 
15
 import java.util.List;
16
 import java.util.List;
16
 
17
 
17
-public class ContentViewPagerAdapter extends PagerAdapter {
18
-
18
+public class ContentViewPagerAdapter extends PagerAdapter implements ViewPager.OnPageChangeListener {
19
     private List<ContentView> contentViews;
19
     private List<ContentView> contentViews;
20
     private List<TopTabParams> topTabParams;
20
     private List<TopTabParams> topTabParams;
21
     private int currentPosition = 0;
21
     private int currentPosition = 0;
31
     }
31
     }
32
 
32
 
33
     @Override
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
     @Override
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
     @Override
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
     @Override
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 Vedi File

54
     private void setupViewPager(TabLayout tabLayout) {
54
     private void setupViewPager(TabLayout tabLayout) {
55
         ContentViewPagerAdapter adapter = new ContentViewPagerAdapter(contentViews, screenParams.topTabParams);
55
         ContentViewPagerAdapter adapter = new ContentViewPagerAdapter(contentViews, screenParams.topTabParams);
56
         viewPager.setAdapter(adapter);
56
         viewPager.setAdapter(adapter);
57
+        viewPager.addOnPageChangeListener(adapter);
57
         tabLayout.setupWithViewPager(viewPager);
58
         tabLayout.setupWithViewPager(viewPager);
58
     }
59
     }
59
 
60
 

+ 12
- 3
android/app/src/main/java/com/reactnativenavigation/views/FloatingActionButtonCoordinator.java Vedi File

6
 import android.graphics.drawable.Drawable;
6
 import android.graphics.drawable.Drawable;
7
 import android.support.annotation.FloatRange;
7
 import android.support.annotation.FloatRange;
8
 import android.support.annotation.NonNull;
8
 import android.support.annotation.NonNull;
9
+import android.support.annotation.Nullable;
9
 import android.support.design.widget.CoordinatorLayout;
10
 import android.support.design.widget.CoordinatorLayout;
10
 import android.support.design.widget.FloatingActionButton;
11
 import android.support.design.widget.FloatingActionButton;
11
 import android.view.Gravity;
12
 import android.view.Gravity;
46
         show();
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
         if (parent.getChildCount() == 0) {
55
         if (parent.getChildCount() == 0) {
51
-            onComplete.run();
56
+            if (onComplete != null) {
57
+                onComplete.run();
58
+            }
52
             return;
59
             return;
53
         }
60
         }
54
 
61
 
56
             @Override
63
             @Override
57
             public void onAnimationEnd(Animator animation) {
64
             public void onAnimationEnd(Animator animation) {
58
                 removeAllViews();
65
                 removeAllViews();
59
-                onComplete.run();
66
+                if (onComplete != null) {
67
+                    onComplete.run();
68
+                }
60
             }
69
             }
61
         });
70
         });
62
         removeFabFromScreen(collapsedFab, null);
71
         removeFabFromScreen(collapsedFab, null);

+ 7
- 7
android/app/src/main/java/com/reactnativenavigation/views/SnackbarAndFabContainer.java Vedi File

7
 import com.reactnativenavigation.events.EventBus;
7
 import com.reactnativenavigation.events.EventBus;
8
 import com.reactnativenavigation.events.ScreenChangedEvent;
8
 import com.reactnativenavigation.events.ScreenChangedEvent;
9
 import com.reactnativenavigation.events.Subscriber;
9
 import com.reactnativenavigation.events.Subscriber;
10
-import com.reactnativenavigation.params.ScreenParams;
10
+import com.reactnativenavigation.params.FabParams;
11
 import com.reactnativenavigation.params.SnackbarParams;
11
 import com.reactnativenavigation.params.SnackbarParams;
12
 
12
 
13
 public class SnackbarAndFabContainer extends CoordinatorLayout implements Snakbar.OnDismissListener, Subscriber{
13
 public class SnackbarAndFabContainer extends CoordinatorLayout implements Snakbar.OnDismissListener, Subscriber{
39
     @Override
39
     @Override
40
     public void onEvent(Event event) {
40
     public void onEvent(Event event) {
41
         if (event.getType() == ScreenChangedEvent.TYPE) {
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
         dismissSnackbar();
47
         dismissSnackbar();
48
-        updateFab(screenParams);
48
+        updateFab(fabParams);
49
     }
49
     }
50
 
50
 
51
     private void dismissSnackbar() {
51
     private void dismissSnackbar() {
55
         }
55
         }
56
     }
56
     }
57
 
57
 
58
-    private void updateFab(final ScreenParams screenParams) {
58
+    private void updateFab(final FabParams fabParams) {
59
         fabCoordinator.remove(new Runnable() {
59
         fabCoordinator.remove(new Runnable() {
60
             @Override
60
             @Override
61
             public void run() {
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 Vedi File

40
     if (navigatorID) {
40
     if (navigatorID) {
41
       tab.navigatorID = navigatorID;
41
       tab.navigatorID = navigatorID;
42
     }
42
     }
43
+    tab.screen = tab.screenId;
44
+    addNavigatorButtons(tab);
43
     adaptNavigationParams(tab);
45
     adaptNavigationParams(tab);
44
   });
46
   });
45
 }
47
 }