Quellcode durchsuchen

Temporary fix to fab position on screen (#5758)

Fab has been broken since v3. This is a very temporary fix until we refactor it and upgrade to fab from AndroidX
Guy Carmeli vor 4 Jahren
Ursprung
Commit
47149835dc
Es ist kein Benutzerkonto mit dieser Commiter-Email verbunden

+ 38
- 146
lib/android/app/src/main/java/com/reactnativenavigation/presentation/FabPresenter.java Datei anzeigen

1
 package com.reactnativenavigation.presentation;
1
 package com.reactnativenavigation.presentation;
2
 
2
 
3
 
3
 
4
-import androidx.annotation.NonNull;
5
 import android.view.Gravity;
4
 import android.view.Gravity;
6
 import android.view.View;
5
 import android.view.View;
7
 import android.view.ViewGroup;
6
 import android.view.ViewGroup;
8
-import android.widget.FrameLayout;
9
-import android.widget.RelativeLayout;
10
 
7
 
11
 import com.reactnativenavigation.R;
8
 import com.reactnativenavigation.R;
12
 import com.reactnativenavigation.parse.FabOptions;
9
 import com.reactnativenavigation.parse.FabOptions;
10
+import com.reactnativenavigation.viewcontrollers.ViewController;
13
 import com.reactnativenavigation.views.Fab;
11
 import com.reactnativenavigation.views.Fab;
14
 import com.reactnativenavigation.views.FabMenu;
12
 import com.reactnativenavigation.views.FabMenu;
15
-import com.reactnativenavigation.views.ReactComponent;
16
 
13
 
17
-import static android.widget.RelativeLayout.ALIGN_PARENT_BOTTOM;
18
-import static android.widget.RelativeLayout.ALIGN_PARENT_LEFT;
19
-import static android.widget.RelativeLayout.ALIGN_PARENT_RIGHT;
20
-import static android.widget.RelativeLayout.ALIGN_PARENT_TOP;
14
+import androidx.annotation.NonNull;
15
+import androidx.coordinatorlayout.widget.CoordinatorLayout;
16
+
17
+import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
21
 import static com.github.clans.fab.FloatingActionButton.SIZE_MINI;
18
 import static com.github.clans.fab.FloatingActionButton.SIZE_MINI;
22
 import static com.github.clans.fab.FloatingActionButton.SIZE_NORMAL;
19
 import static com.github.clans.fab.FloatingActionButton.SIZE_NORMAL;
20
+import static com.reactnativenavigation.utils.ObjectUtils.perform;
23
 
21
 
24
 public class FabPresenter {
22
 public class FabPresenter {
25
     private ViewGroup viewGroup;
23
     private ViewGroup viewGroup;
26
-    private ReactComponent component;
24
+    private ViewController component;
27
 
25
 
28
     private Fab fab;
26
     private Fab fab;
29
     private FabMenu fabMenu;
27
     private FabMenu fabMenu;
30
 
28
 
31
-    public void applyOptions(FabOptions options, @NonNull ReactComponent component, @NonNull ViewGroup viewGroup) {
29
+    public void applyOptions(FabOptions options, @NonNull ViewController component, @NonNull ViewGroup viewGroup) {
32
         this.viewGroup = viewGroup;
30
         this.viewGroup = viewGroup;
33
         this.component = component;
31
         this.component = component;
34
 
32
 
51
         }
49
         }
52
     }
50
     }
53
 
51
 
54
-    public void mergeOptions(FabOptions options, @NonNull ReactComponent component, @NonNull ViewGroup viewGroup) {
52
+    public void mergeOptions(FabOptions options, @NonNull ViewController component, @NonNull ViewGroup viewGroup) {
55
         this.viewGroup = viewGroup;
53
         this.viewGroup = viewGroup;
56
         this.component = component;
54
         this.component = component;
57
-
58
         if (options.id.hasValue()) {
55
         if (options.id.hasValue()) {
59
             if (fabMenu != null && fabMenu.getFabId().equals(options.id.get())) {
56
             if (fabMenu != null && fabMenu.getFabId().equals(options.id.get())) {
60
                 mergeParams(fabMenu, options);
57
                 mergeParams(fabMenu, options);
103
     }
100
     }
104
 
101
 
105
     private void setParams(View fab, FabOptions options) {
102
     private void setParams(View fab, FabOptions options) {
106
-        ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
107
-        if (viewGroup instanceof RelativeLayout) {
108
-            RelativeLayout.LayoutParams layoutParamsRelative = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
109
-            layoutParamsRelative.bottomMargin = (int) viewGroup.getContext().getResources().getDimension(R.dimen.margin);
110
-            layoutParamsRelative.rightMargin = (int) viewGroup.getContext().getResources().getDimension(R.dimen.margin);
111
-            layoutParamsRelative.leftMargin = (int) viewGroup.getContext().getResources().getDimension(R.dimen.margin);
112
-            layoutParamsRelative.topMargin = (int) viewGroup.getContext().getResources().getDimension(R.dimen.margin);
113
-            if (options.alignHorizontally.hasValue()) {
114
-                if ("right".equals(options.alignHorizontally.get())) {
115
-                    layoutParamsRelative.removeRule(ALIGN_PARENT_LEFT);
116
-                    layoutParamsRelative.addRule(ALIGN_PARENT_RIGHT);
117
-                }
118
-                if ("left".equals(options.alignHorizontally.get())) {
119
-                    layoutParamsRelative.removeRule(ALIGN_PARENT_RIGHT);
120
-                    layoutParamsRelative.addRule(ALIGN_PARENT_LEFT);
121
-                }
122
-            } else {
123
-                layoutParamsRelative.addRule(ALIGN_PARENT_RIGHT);
103
+        CoordinatorLayout.LayoutParams lp = new CoordinatorLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT);
104
+        lp.rightMargin = (int) viewGroup.getContext().getResources().getDimension(R.dimen.margin);
105
+        lp.leftMargin = (int) viewGroup.getContext().getResources().getDimension(R.dimen.margin);
106
+        lp.bottomMargin = (int) viewGroup.getContext().getResources().getDimension(R.dimen.margin);
107
+        fab.setTag(R.id.fab_bottom_margin, lp.bottomMargin);
108
+        lp.gravity = Gravity.BOTTOM;
109
+        if (options.alignHorizontally.hasValue()) {
110
+            if ("right".equals(options.alignHorizontally.get())) {
111
+                lp.gravity |= Gravity.RIGHT;
124
             }
112
             }
125
-            if (options.alignVertically.hasValue()) {
126
-                if ("top".equals(options.alignVertically.get())) {
127
-                    layoutParamsRelative.removeRule(ALIGN_PARENT_BOTTOM);
128
-                    layoutParamsRelative.addRule(ALIGN_PARENT_TOP);
129
-                }
130
-                if ("bottom".equals(options.alignVertically.get())) {
131
-                    layoutParamsRelative.removeRule(ALIGN_PARENT_TOP);
132
-                    layoutParamsRelative.addRule(ALIGN_PARENT_BOTTOM);
133
-                }
134
-            } else {
135
-                layoutParamsRelative.addRule(ALIGN_PARENT_BOTTOM);
113
+            if ("left".equals(options.alignHorizontally.get())) {
114
+                lp.gravity |= Gravity.LEFT;
136
             }
115
             }
137
-            layoutParams = layoutParamsRelative;
138
-        }
139
-        if (viewGroup instanceof FrameLayout) {
140
-            FrameLayout.LayoutParams layoutParamsFrame = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
141
-            layoutParamsFrame.bottomMargin = (int) viewGroup.getContext().getResources().getDimension(R.dimen.margin);
142
-            layoutParamsFrame.rightMargin = (int) viewGroup.getContext().getResources().getDimension(R.dimen.margin);
143
-            layoutParamsFrame.leftMargin = (int) viewGroup.getContext().getResources().getDimension(R.dimen.margin);
144
-            layoutParamsFrame.topMargin = (int) viewGroup.getContext().getResources().getDimension(R.dimen.margin);
145
-            if (options.alignHorizontally.hasValue()) {
146
-                if ("right".equals(options.alignHorizontally.get())) {
147
-                    removeGravityParam(layoutParamsFrame, Gravity.LEFT);
148
-                    setGravityParam(layoutParamsFrame, Gravity.RIGHT);
149
-                }
150
-                if ("left".equals(options.alignHorizontally.get())) {
151
-                    removeGravityParam(layoutParamsFrame, Gravity.RIGHT);
152
-                    setGravityParam(layoutParamsFrame, Gravity.LEFT);
153
-                }
154
-            } else {
155
-                setGravityParam(layoutParamsFrame, Gravity.RIGHT);
156
-            }
157
-            if (options.alignVertically.hasValue()) {
158
-                if ("top".equals(options.alignVertically.get())) {
159
-                    removeGravityParam(layoutParamsFrame, Gravity.BOTTOM);
160
-                    setGravityParam(layoutParamsFrame, Gravity.TOP);
161
-                }
162
-                if ("bottom".equals(options.alignVertically.get())) {
163
-                    removeGravityParam(layoutParamsFrame, Gravity.TOP);
164
-                    setGravityParam(layoutParamsFrame, Gravity.BOTTOM);
165
-                }
166
-            } else {
167
-                setGravityParam(layoutParamsFrame, Gravity.BOTTOM);
168
-            }
169
-            layoutParams = layoutParamsFrame;
116
+        } else {
117
+            lp.gravity |= Gravity.RIGHT;
170
         }
118
         }
171
-        fab.setLayoutParams(layoutParams);
119
+        fab.setLayoutParams(lp);
172
     }
120
     }
173
 
121
 
174
     private void mergeParams(View fab, FabOptions options) {
122
     private void mergeParams(View fab, FabOptions options) {
175
-        ViewGroup.LayoutParams layoutParams = fab.getLayoutParams();
176
-        if (viewGroup instanceof RelativeLayout) {
177
-            RelativeLayout.LayoutParams layoutParamsRelative = (RelativeLayout.LayoutParams) fab.getLayoutParams();
178
-            if (layoutParamsRelative == null) {
179
-                layoutParamsRelative = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
180
-                layoutParamsRelative.bottomMargin = (int) viewGroup.getContext().getResources().getDimension(R.dimen.margin);
181
-                layoutParamsRelative.rightMargin = (int) viewGroup.getContext().getResources().getDimension(R.dimen.margin);
182
-                layoutParamsRelative.leftMargin = (int) viewGroup.getContext().getResources().getDimension(R.dimen.margin);
183
-                layoutParamsRelative.topMargin = (int) viewGroup.getContext().getResources().getDimension(R.dimen.margin);
123
+        CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams) perform(
124
+                fab,
125
+                new CoordinatorLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT),
126
+                View::getLayoutParams
127
+        );
128
+        fab.setTag(R.id.fab_bottom_margin, lp.leftMargin);
129
+        lp.gravity = Gravity.BOTTOM;
130
+        if (options.alignHorizontally.hasValue()) {
131
+            if ("right".equals(options.alignHorizontally.get())) {
132
+                lp.gravity |= Gravity.RIGHT;
184
             }
133
             }
185
-            if (options.alignHorizontally.hasValue()) {
186
-                if ("right".equals(options.alignHorizontally.get())) {
187
-                    layoutParamsRelative.removeRule(ALIGN_PARENT_LEFT);
188
-                    layoutParamsRelative.addRule(ALIGN_PARENT_RIGHT);
189
-                }
190
-                if ("left".equals(options.alignHorizontally.get())) {
191
-                    layoutParamsRelative.removeRule(ALIGN_PARENT_RIGHT);
192
-                    layoutParamsRelative.addRule(ALIGN_PARENT_LEFT);
193
-                }
134
+            if ("left".equals(options.alignHorizontally.get())) {
135
+                lp.gravity |= Gravity.RIGHT;
194
             }
136
             }
195
-            if (options.alignVertically.hasValue()) {
196
-                if ("top".equals(options.alignVertically.get())) {
197
-                    layoutParamsRelative.removeRule(ALIGN_PARENT_BOTTOM);
198
-                    layoutParamsRelative.addRule(ALIGN_PARENT_TOP);
199
-                }
200
-                if ("bottom".equals(options.alignVertically.get())) {
201
-                    layoutParamsRelative.removeRule(ALIGN_PARENT_TOP);
202
-                    layoutParamsRelative.addRule(ALIGN_PARENT_BOTTOM);
203
-                }
204
-            }
205
-            layoutParams = layoutParamsRelative;
206
-        }
207
-        if (viewGroup instanceof FrameLayout) {
208
-            FrameLayout.LayoutParams layoutParamsFrame = (FrameLayout.LayoutParams) fab.getLayoutParams();
209
-            if (layoutParamsFrame == null) {
210
-                layoutParamsFrame = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
211
-                layoutParamsFrame.bottomMargin = (int) viewGroup.getContext().getResources().getDimension(R.dimen.margin);
212
-                layoutParamsFrame.rightMargin = (int) viewGroup.getContext().getResources().getDimension(R.dimen.margin);
213
-                layoutParamsFrame.leftMargin = (int) viewGroup.getContext().getResources().getDimension(R.dimen.margin);
214
-                layoutParamsFrame.topMargin = (int) viewGroup.getContext().getResources().getDimension(R.dimen.margin);
215
-            }
216
-            if (options.alignHorizontally.hasValue()) {
217
-                if ("right".equals(options.alignHorizontally.get())) {
218
-                    removeGravityParam(layoutParamsFrame, Gravity.LEFT);
219
-                    setGravityParam(layoutParamsFrame, Gravity.RIGHT);
220
-                }
221
-                if ("left".equals(options.alignHorizontally.get())) {
222
-                    removeGravityParam(layoutParamsFrame, Gravity.RIGHT);
223
-                    setGravityParam(layoutParamsFrame, Gravity.LEFT);
224
-                }
225
-            }
226
-            if (options.alignVertically.hasValue()) {
227
-                if ("top".equals(options.alignVertically.get())) {
228
-                    removeGravityParam(layoutParamsFrame, Gravity.BOTTOM);
229
-                    setGravityParam(layoutParamsFrame, Gravity.TOP);
230
-                }
231
-                if ("bottom".equals(options.alignVertically.get())) {
232
-                    removeGravityParam(layoutParamsFrame, Gravity.TOP);
233
-                    setGravityParam(layoutParamsFrame, Gravity.BOTTOM);
234
-                }
235
-            }
236
-            layoutParams = layoutParamsFrame;
137
+        } else {
138
+            lp.gravity |= Gravity.RIGHT;
237
         }
139
         }
238
-        fab.setLayoutParams(layoutParams);
140
+        fab.setLayoutParams(lp);
239
     }
141
     }
240
 
142
 
241
     private void applyFabOptions(Fab fab, FabOptions options) {
143
     private void applyFabOptions(Fab fab, FabOptions options) {
373
             fabMenu.disableCollapse();
275
             fabMenu.disableCollapse();
374
         }
276
         }
375
     }
277
     }
376
-
377
-    private void setGravityParam(FrameLayout.LayoutParams params, int gravityParam) {
378
-        params.gravity = params.gravity | gravityParam;
379
-    }
380
-
381
-    private void removeGravityParam(FrameLayout.LayoutParams params, int gravityParam) {
382
-        if ((params.gravity & gravityParam) == gravityParam) {
383
-            params.gravity = params.gravity & ~gravityParam;
384
-        }
385
-    }
386
 }
278
 }

+ 8
- 0
lib/android/app/src/main/java/com/reactnativenavigation/utils/CoordinatorLayoutUtils.java Datei anzeigen

1
 package com.reactnativenavigation.utils;
1
 package com.reactnativenavigation.utils;
2
 
2
 
3
+import android.view.View;
4
+
5
+import com.reactnativenavigation.R;
6
+
3
 import androidx.coordinatorlayout.widget.CoordinatorLayout;
7
 import androidx.coordinatorlayout.widget.CoordinatorLayout;
4
 
8
 
5
 import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
9
 import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
14
         lp.setBehavior(behavior);
18
         lp.setBehavior(behavior);
15
         return lp;
19
         return lp;
16
     }
20
     }
21
+
22
+    public static void updateBottomMargin(View view, int additionalMargin) {
23
+        ((CoordinatorLayout.LayoutParams) view.getLayoutParams()).bottomMargin = additionalMargin + ViewTags.get(view, R.id.fab_bottom_margin, 0);
24
+    }
17
 }
25
 }

+ 2
- 2
lib/android/app/src/main/java/com/reactnativenavigation/utils/ObjectUtils.java Datei anzeigen

1
 package com.reactnativenavigation.utils;
1
 package com.reactnativenavigation.utils;
2
 
2
 
3
-import androidx.annotation.Nullable;
4
-
5
 import com.reactnativenavigation.utils.Functions.Func1;
3
 import com.reactnativenavigation.utils.Functions.Func1;
6
 import com.reactnativenavigation.utils.Functions.FuncR1;
4
 import com.reactnativenavigation.utils.Functions.FuncR1;
7
 
5
 
6
+import androidx.annotation.Nullable;
7
+
8
 public class ObjectUtils {
8
 public class ObjectUtils {
9
     public static <T> void perform(@Nullable T obj, Func1<T> action) {
9
     public static <T> void perform(@Nullable T obj, Func1<T> action) {
10
         if (obj != null) action.run(obj);
10
         if (obj != null) action.run(obj);

+ 11
- 0
lib/android/app/src/main/java/com/reactnativenavigation/utils/ViewTags.java Datei anzeigen

1
+package com.reactnativenavigation.utils;
2
+
3
+import android.view.View;
4
+
5
+import androidx.annotation.NonNull;
6
+
7
+public class ViewTags {
8
+    public static @NonNull <T> T get(View view, int key, @NonNull T defaultValue) {
9
+        return view.getTag(key) == null ? defaultValue : (T) view.getTag(key);
10
+    }
11
+}

+ 6
- 0
lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/ComponentViewController.java Datei anzeigen

3
 import android.app.Activity;
3
 import android.app.Activity;
4
 import android.view.View;
4
 import android.view.View;
5
 
5
 
6
+import com.reactnativenavigation.interfaces.ScrollEventListener;
6
 import com.reactnativenavigation.parse.Options;
7
 import com.reactnativenavigation.parse.Options;
7
 import com.reactnativenavigation.presentation.ComponentPresenter;
8
 import com.reactnativenavigation.presentation.ComponentPresenter;
8
 import com.reactnativenavigation.presentation.Presenter;
9
 import com.reactnativenavigation.presentation.Presenter;
45
         presenter.setDefaultOptions(defaultOptions);
46
         presenter.setDefaultOptions(defaultOptions);
46
     }
47
     }
47
 
48
 
49
+    @Override
50
+    public ScrollEventListener getScrollEventListener() {
51
+        return perform(view, null, ComponentLayout::getScrollEventListener);
52
+    }
53
+
48
     @Override
54
     @Override
49
     public void onViewAppeared() {
55
     public void onViewAppeared() {
50
         super.onViewAppeared();
56
         super.onViewAppeared();

+ 5
- 0
lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/ViewController.java Datei anzeigen

6
 import android.view.ViewManager;
6
 import android.view.ViewManager;
7
 import android.view.ViewTreeObserver;
7
 import android.view.ViewTreeObserver;
8
 
8
 
9
+import com.reactnativenavigation.interfaces.ScrollEventListener;
9
 import com.reactnativenavigation.parse.Options;
10
 import com.reactnativenavigation.parse.Options;
10
 import com.reactnativenavigation.parse.params.Bool;
11
 import com.reactnativenavigation.parse.params.Bool;
11
 import com.reactnativenavigation.parse.params.NullBool;
12
 import com.reactnativenavigation.parse.params.NullBool;
86
         this.waitForRender = waitForRender;
87
         this.waitForRender = waitForRender;
87
     }
88
     }
88
 
89
 
90
+    public ScrollEventListener getScrollEventListener() {
91
+        return null;
92
+    }
93
+
89
     public void addOnAppearedListener(Runnable onAppearedListener) {
94
     public void addOnAppearedListener(Runnable onAppearedListener) {
90
         onAppearedListeners.add(onAppearedListener);
95
         onAppearedListeners.add(onAppearedListener);
91
     }
96
     }

+ 10
- 7
lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/stack/StackController.java Datei anzeigen

18
 import com.reactnativenavigation.viewcontrollers.ViewController;
18
 import com.reactnativenavigation.viewcontrollers.ViewController;
19
 import com.reactnativenavigation.viewcontrollers.topbar.TopBarController;
19
 import com.reactnativenavigation.viewcontrollers.topbar.TopBarController;
20
 import com.reactnativenavigation.views.Component;
20
 import com.reactnativenavigation.views.Component;
21
-import com.reactnativenavigation.views.ReactComponent;
21
+import com.reactnativenavigation.views.Fab;
22
+import com.reactnativenavigation.views.FabMenu;
22
 import com.reactnativenavigation.views.StackLayout;
23
 import com.reactnativenavigation.views.StackLayout;
23
 import com.reactnativenavigation.views.stack.StackBehaviour;
24
 import com.reactnativenavigation.views.stack.StackBehaviour;
24
 import com.reactnativenavigation.views.topbar.TopBar;
25
 import com.reactnativenavigation.views.topbar.TopBar;
35
 
36
 
36
 import static com.reactnativenavigation.utils.CollectionUtils.*;
37
 import static com.reactnativenavigation.utils.CollectionUtils.*;
37
 import static com.reactnativenavigation.utils.CoordinatorLayoutUtils.matchParentWithBehaviour;
38
 import static com.reactnativenavigation.utils.CoordinatorLayoutUtils.matchParentWithBehaviour;
39
+import static com.reactnativenavigation.utils.CoordinatorLayoutUtils.updateBottomMargin;
38
 import static com.reactnativenavigation.utils.ObjectUtils.perform;
40
 import static com.reactnativenavigation.utils.ObjectUtils.perform;
39
 
41
 
40
 public class StackController extends ParentController<StackLayout> {
42
 public class StackController extends ParentController<StackLayout> {
98
     public void applyChildOptions(Options options, ViewController child) {
100
     public void applyChildOptions(Options options, ViewController child) {
99
         super.applyChildOptions(options, child);
101
         super.applyChildOptions(options, child);
100
         presenter.applyChildOptions(resolveCurrentOptions(), this, child);
102
         presenter.applyChildOptions(resolveCurrentOptions(), this, child);
101
-        if (child.getView() instanceof ReactComponent) {
102
-            fabOptionsPresenter.applyOptions(this.options.fabOptions, (ReactComponent) child.getView(), getView());
103
-        }
103
+        fabOptionsPresenter.applyOptions(this.options.fabOptions, child, getView());
104
         performOnParentController(parent ->
104
         performOnParentController(parent ->
105
                 parent.applyChildOptions(
105
                 parent.applyChildOptions(
106
                         this.options.copy()
106
                         this.options.copy()
119
         super.mergeChildOptions(options, child);
119
         super.mergeChildOptions(options, child);
120
         if (child.isViewShown() && peek() == child) {
120
         if (child.isViewShown() && peek() == child) {
121
             presenter.mergeChildOptions(options, resolveCurrentOptions(), this, child);
121
             presenter.mergeChildOptions(options, resolveCurrentOptions(), this, child);
122
-            if (options.fabOptions.hasValue() && child instanceof ReactComponent) {
123
-                fabOptionsPresenter.mergeOptions(options.fabOptions, (ReactComponent) child, getView());
122
+            if (options.fabOptions.hasValue()) {
123
+                fabOptionsPresenter.mergeOptions(options.fabOptions, child, getView());
124
             }
124
             }
125
         }
125
         }
126
         performOnParentController(parent ->
126
         performOnParentController(parent ->
395
 
395
 
396
     @Override
396
     @Override
397
     public boolean onDependentViewChanged(CoordinatorLayout parent, ViewGroup child, View dependency) {
397
     public boolean onDependentViewChanged(CoordinatorLayout parent, ViewGroup child, View dependency) {
398
-        perform(findController(child), controller -> presenter.applyTopInsets(this, controller));
398
+        perform(findController(child), controller -> {
399
+            if (dependency instanceof TopBar) presenter.applyTopInsets(this, controller);
400
+            if (dependency instanceof Fab || dependency instanceof FabMenu) updateBottomMargin(dependency, getBottomInset());
401
+        });
399
         return false;
402
         return false;
400
     }
403
     }
401
 
404
 

+ 5
- 1
lib/android/app/src/main/java/com/reactnativenavigation/views/stack/StackBehaviour.java Datei anzeigen

5
 
5
 
6
 import com.reactnativenavigation.views.BehaviourAdapter;
6
 import com.reactnativenavigation.views.BehaviourAdapter;
7
 import com.reactnativenavigation.views.BehaviourDelegate;
7
 import com.reactnativenavigation.views.BehaviourDelegate;
8
+import com.reactnativenavigation.views.Fab;
9
+import com.reactnativenavigation.views.FabMenu;
8
 import com.reactnativenavigation.views.topbar.TopBar;
10
 import com.reactnativenavigation.views.topbar.TopBar;
9
 
11
 
10
 import androidx.annotation.NonNull;
12
 import androidx.annotation.NonNull;
17
 
19
 
18
     @Override
20
     @Override
19
     public boolean layoutDependsOn(@NonNull CoordinatorLayout parent, @NonNull ViewGroup child, @NonNull View dependency) {
21
     public boolean layoutDependsOn(@NonNull CoordinatorLayout parent, @NonNull ViewGroup child, @NonNull View dependency) {
20
-        return dependency instanceof TopBar;
22
+        return dependency instanceof TopBar ||
23
+               dependency instanceof Fab ||
24
+               dependency instanceof FabMenu;
21
     }
25
     }
22
 }
26
 }

+ 1
- 0
lib/android/app/src/main/res/values/ids.xml Datei anzeigen

4
     <item name="fragment_screen_content" type="id"/>
4
     <item name="fragment_screen_content" type="id"/>
5
     <item name="topBarBackgroundComponent" type="id"/>
5
     <item name="topBarBackgroundComponent" type="id"/>
6
     <item name="bottomTabs" type="id"/>
6
     <item name="bottomTabs" type="id"/>
7
+    <item name="fab_bottom_margin" type="id" />
7
 </resources>
8
 </resources>

+ 2
- 1
lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/FloatingActionButtonTest.java Datei anzeigen

1
 package com.reactnativenavigation.viewcontrollers;
1
 package com.reactnativenavigation.viewcontrollers;
2
 
2
 
3
 import android.app.Activity;
3
 import android.app.Activity;
4
-import androidx.annotation.NonNull;
5
 import android.view.View;
4
 import android.view.View;
6
 import android.view.ViewGroup;
5
 import android.view.ViewGroup;
7
 
6
 
19
 
18
 
20
 import org.junit.Test;
19
 import org.junit.Test;
21
 
20
 
21
+import androidx.annotation.NonNull;
22
+
22
 import static org.assertj.core.api.Java6Assertions.assertThat;
23
 import static org.assertj.core.api.Java6Assertions.assertThat;
23
 
24
 
24
 public class FloatingActionButtonTest extends BaseTest {
25
 public class FloatingActionButtonTest extends BaseTest {

+ 1
- 1
lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/stack/StackControllerTest.java Datei anzeigen

1080
     public void onDependentViewChanged_delegatesToPresenter() {
1080
     public void onDependentViewChanged_delegatesToPresenter() {
1081
         CoordinatorLayout parent = Mockito.mock(CoordinatorLayout.class);
1081
         CoordinatorLayout parent = Mockito.mock(CoordinatorLayout.class);
1082
         uut.push(child1, new CommandListenerAdapter());
1082
         uut.push(child1, new CommandListenerAdapter());
1083
-        assertThat(uut.onDependentViewChanged(parent, child1.getView(), Mockito.mock(View.class))).isFalse();
1083
+        assertThat(uut.onDependentViewChanged(parent, child1.getView(), Mockito.mock(TopBar.class))).isFalse();
1084
         verify(presenter).applyTopInsets(eq(uut), eq(child1));
1084
         verify(presenter).applyTopInsets(eq(uut), eq(child1));
1085
     }
1085
     }
1086
 
1086
 

+ 2
- 1
playground/src/commons/Colors.js Datei anzeigen

1
 module.exports = {
1
 module.exports = {
2
   background: '#e8e8e8',
2
   background: '#e8e8e8',
3
-  primary: '#5847ff'
3
+  primary: '#5847ff',
4
+  secondary: '#FFC249'
4
 }
5
 }

+ 6
- 2
playground/src/screens/ButtonsScreen.js Datei anzeigen

19
 class Options extends Component {
19
 class Options extends Component {
20
   static options() {
20
   static options() {
21
     return {
21
     return {
22
+      fab: {
23
+        id: 'fab',
24
+        icon: require('../../img/navicon_add.png'),
25
+        backgroundColor: Colors.secondary
26
+      },
22
       topBar: {
27
       topBar: {
23
-        visible: true,
24
         testID: TOP_BAR,
28
         testID: TOP_BAR,
25
         title: {
29
         title: {
26
-          text: 'Styling Options'
30
+          text: 'Buttons'
27
         },
31
         },
28
         rightButtons: [
32
         rightButtons: [
29
           {
33
           {