Browse Source

Toolbar buttons

Guy Carmeli 8 years ago
parent
commit
ce753bf979

+ 104
- 0
android/app/src/main/java/com/reactnativenavigation/views/Button.java View File

@@ -0,0 +1,104 @@
1
+package com.reactnativenavigation.views;
2
+
3
+import android.app.Activity;
4
+import android.graphics.drawable.Drawable;
5
+import android.support.annotation.ColorInt;
6
+import android.support.annotation.NonNull;
7
+import android.view.Menu;
8
+import android.view.MenuItem;
9
+import android.view.View;
10
+import android.view.ViewTreeObserver;
11
+import android.widget.TextView;
12
+
13
+import com.reactnativenavigation.utils.ImageUtils;
14
+
15
+import java.util.ArrayList;
16
+
17
+public class Button {
18
+    public enum ShowAsAction {
19
+        IfRoom(MenuItem.SHOW_AS_ACTION_IF_ROOM),
20
+        Always(MenuItem.SHOW_AS_ACTION_ALWAYS),
21
+        Never(MenuItem.SHOW_AS_ACTION_NEVER),
22
+        WithText(MenuItem.SHOW_AS_ACTION_WITH_TEXT);
23
+
24
+        int action;
25
+        ShowAsAction(int action) {
26
+            this.action = action;
27
+        }
28
+    }
29
+
30
+    String label;
31
+    Drawable icon;
32
+    @ColorInt
33
+    int color;
34
+    ShowAsAction showAsAction;
35
+
36
+    public MenuItem addToMenu(Activity context, Menu menu, int index) {
37
+        MenuItem item = menu.add(Menu.NONE, Menu.NONE, index, label);
38
+        setShowAsAction(item);
39
+        setIcon(item);
40
+        setColor(context, item);
41
+        return item;
42
+    }
43
+
44
+    private void setShowAsAction(MenuItem item) {
45
+        item.setShowAsAction(showAsAction.action);
46
+    }
47
+
48
+    private void setIcon(MenuItem item) {
49
+        if (icon != null) {
50
+            item.setIcon(icon);
51
+        }
52
+    }
53
+
54
+    private void setColor(Activity context, MenuItem item) {
55
+        if (!hasColor()) {
56
+            return;
57
+        }
58
+
59
+        if (hasIcon()) {
60
+            setIconColor();
61
+        } else {
62
+            setTextColor(context);
63
+        }
64
+    }
65
+
66
+    private void setTextColor(Activity context) {
67
+        final View decorView = context.getWindow().getDecorView();
68
+        decorView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
69
+            @Override
70
+            public void onGlobalLayout() {
71
+                decorView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
72
+
73
+                ArrayList<View> outViews = findButtonTextView();
74
+                setTextColorInternal(outViews);
75
+            }
76
+
77
+            @NonNull
78
+            private ArrayList<View> findButtonTextView() {
79
+                ArrayList<View> outViews = new ArrayList<>();
80
+                decorView.findViewsWithText(outViews, label, View.FIND_VIEWS_WITH_CONTENT_DESCRIPTION);
81
+                return outViews;
82
+            }
83
+
84
+            private void setTextColorInternal(ArrayList<View> outViews) {
85
+                for (View button : outViews) {
86
+                    ((TextView) button).setTextColor(color);
87
+                }
88
+            }
89
+        });
90
+    }
91
+
92
+    private void setIconColor() {
93
+        ImageUtils.tint(icon, color);
94
+    }
95
+
96
+    private boolean hasIcon() {
97
+        return icon != null;
98
+    }
99
+
100
+    private boolean hasColor() {
101
+        return color > 0;
102
+    }
103
+
104
+}

+ 14
- 14
android/app/src/main/java/com/reactnativenavigation/views/TitleBar.java View File

@@ -1,8 +1,6 @@
1 1
 package com.reactnativenavigation.views;
2 2
 
3 3
 import android.app.Activity;
4
-import android.graphics.drawable.Drawable;
5
-import android.support.annotation.ColorInt;
6 4
 import android.support.v7.widget.ActionMenuView;
7 5
 import android.support.v7.widget.Toolbar;
8 6
 import android.view.Menu;
@@ -14,16 +12,10 @@ import java.util.List;
14 12
 
15 13
 public class TitleBar extends Toolbar {
16 14
 
17
-    public static class Button {
18
-        public enum ShowAsAction {
19
-            IfRoom, Always, Never, WithText
20
-        }
15
+    private Menu menu;
16
+    private ActionMenuView actionMenuView;
17
+
21 18
 
22
-        String label;
23
-        Drawable icon;
24
-        @ColorInt int color;
25
-        ShowAsAction showAsAction;
26
-    }
27 19
 
28 20
     public TitleBar(Activity context) {
29 21
         super(context);
@@ -32,14 +24,22 @@ public class TitleBar extends Toolbar {
32 24
 
33 25
     private void createMenu() {
34 26
         MenuInflater menuInflater = ((Activity) getContext()).getMenuInflater();
35
-        ActionMenuView actionMenuView = new ActionMenuView(getContext());
36
-        Menu menu = actionMenuView.getMenu();
27
+        actionMenuView = new ActionMenuView(getContext());
28
+        menu = actionMenuView.getMenu();
37 29
         menuInflater.inflate(R.menu.stub, menu);
38 30
         addView(actionMenuView);
39 31
         // TODO: Maybe setSupportActionBar
40 32
     }
41 33
 
42 34
     public void setButtons(List<Button> buttons) {
43
-        Menu menu = new
35
+        removeView(actionMenuView);
36
+        createMenu();
37
+
38
+        Activity context = (Activity) getContext();
39
+        for (int i = 0; i < buttons.size(); i++) {
40
+            final Button button = buttons.get(i);
41
+            final int index = buttons.size() - i - 1;
42
+            button.addToMenu(context, menu, index);
43
+        }
44 44
     }
45 45
 }