1
1
package de .dlyt .yanndroid .oneui .menu ;
2
2
3
3
import android .content .Context ;
4
+ import android .graphics .Typeface ;
5
+ import android .text .TextUtils ;
4
6
import android .util .TypedValue ;
5
7
import android .view .KeyEvent ;
6
8
import android .view .MotionEvent ;
7
9
import android .view .View ;
8
10
import android .view .ViewGroup ;
9
11
import android .widget .ArrayAdapter ;
12
+ import android .widget .LinearLayout ;
10
13
import android .widget .PopupWindow ;
14
+ import android .widget .TextView ;
11
15
12
16
import androidx .annotation .MenuRes ;
13
17
@@ -28,6 +32,9 @@ public class PopupMenu {
28
32
private PopupListView listView ;
29
33
private PopupMenuAdapter popupMenuAdapter ;
30
34
35
+ private LinearLayout layoutWithTitle ;
36
+ private CharSequence title ;
37
+
31
38
private int xoff = 0 ;
32
39
private int yoff = 0 ;
33
40
@@ -54,8 +61,17 @@ public void inflate(@MenuRes int menuRes) {
54
61
inflate (new Menu (menuRes , context ));
55
62
}
56
63
64
+ public void inflate (@ MenuRes int menuRes , CharSequence title ) {
65
+ inflate (new Menu (menuRes , context ), title );
66
+ }
67
+
57
68
public void inflate (Menu menu ) {
69
+ inflate (menu , null );
70
+ }
71
+
72
+ public void inflate (Menu menu , CharSequence title ) {
58
73
this .menu = menu ;
74
+ this .title = title ;
59
75
60
76
if (popupWindow != null ) {
61
77
if (popupWindow .isShowing ()) {
@@ -78,8 +94,8 @@ public void inflate(Menu menu) {
78
94
MenuItem clickedMenuItem = menu .getItem (position );
79
95
if (clickedMenuItem .isCheckable ()) clickedMenuItem .toggleChecked ();
80
96
if (clickedMenuItem .hasSubMenu ()) {
81
- PopupMenu subPopupMenu = new PopupMenu (anchor ); //itemViews.get(position)
82
- subPopupMenu .inflate (clickedMenuItem .getSubMenu ());
97
+ PopupMenu subPopupMenu = new PopupMenu (anchor );
98
+ subPopupMenu .inflate (clickedMenuItem .getSubMenu (), menu . getItem ( position ). getTitle () );
83
99
subPopupMenu .setPopupMenuListener (new PopupMenuListener () {
84
100
@ Override
85
101
public boolean onMenuItemClick (MenuItem item ) {
@@ -98,12 +114,18 @@ public void onMenuItemUpdate(MenuItem menuItem) {
98
114
}
99
115
});
100
116
101
- listView .measure (ViewGroup .LayoutParams .WRAP_CONTENT , ViewGroup .LayoutParams .WRAP_CONTENT );
102
- int height = listView .getMeasuredHeight () + context .getResources ().getDimensionPixelSize (R .dimen .sesl_popup_menu_item_bottom_padding ) - 5 ;
117
+ if (title != null ) {
118
+ layoutWithTitle = new LinearLayout (context );
119
+ layoutWithTitle .setOrientation (LinearLayout .VERTICAL );
120
+ layoutWithTitle .addView (createTitleView ());
121
+ layoutWithTitle .addView (listView );
122
+ popupWindow = new PopupWindow (layoutWithTitle );
123
+ } else {
124
+ popupWindow = new PopupWindow (listView );
125
+ }
103
126
104
- popupWindow = new PopupWindow (listView );
105
127
popupWindow .setWidth (getPopupMenuWidth ());
106
- popupWindow .setHeight (height );
128
+ popupWindow .setHeight (getPopupMenuHeight () );
107
129
popupWindow .setAnimationStyle (R .style .MenuPopupAnimStyle );
108
130
popupWindow .setBackgroundDrawable (context .getResources ().getDrawable (R .drawable .sesl_menu_popup_background , context .getTheme ()));
109
131
popupWindow .setOutsideTouchable (true );
@@ -129,6 +151,22 @@ public boolean onTouch(View view, MotionEvent motionEvent) {
129
151
});
130
152
}
131
153
154
+ private TextView createTitleView () {
155
+ TextView titleView = new TextView (context );
156
+ titleView .setPadding (context .getResources ().getDimensionPixelSize (R .dimen .sesl_popup_menu_item_start_padding ),
157
+ context .getResources ().getDimensionPixelSize (R .dimen .sesl_popup_menu_item_top_padding ),
158
+ context .getResources ().getDimensionPixelSize (R .dimen .sesl_popup_menu_item_end_padding ),
159
+ context .getResources ().getDimensionPixelSize (R .dimen .sesl_menu_popup_bottom_padding ));
160
+ titleView .setTextDirection (View .TEXT_DIRECTION_LOCALE );
161
+ titleView .setTextColor (context .getResources ().getColor (R .color .item_color ));
162
+ titleView .setTypeface (Typeface .DEFAULT_BOLD );
163
+ titleView .setEllipsize (TextUtils .TruncateAt .END );
164
+ titleView .setMaxLines (1 );
165
+ titleView .setTextSize (16 );
166
+ titleView .setText (title );
167
+ return titleView ;
168
+ }
169
+
132
170
public int getPopupMenuWidth () {
133
171
int makeMeasureSpec = View .MeasureSpec .makeMeasureSpec (0 , View .MeasureSpec .UNSPECIFIED );
134
172
int popupWidth = 0 ;
@@ -144,10 +182,18 @@ public int getPopupMenuWidth() {
144
182
return popupWidth ;
145
183
}
146
184
185
+ public int getPopupMenuHeight () {
186
+ if (title == null ) {
187
+ listView .measure (ViewGroup .LayoutParams .WRAP_CONTENT , ViewGroup .LayoutParams .WRAP_CONTENT );
188
+ return listView .getMeasuredHeight () + context .getResources ().getDimensionPixelSize (R .dimen .sesl_popup_menu_item_bottom_padding ) - 5 ;
189
+ } else {
190
+ layoutWithTitle .measure (ViewGroup .LayoutParams .WRAP_CONTENT , ViewGroup .LayoutParams .WRAP_CONTENT );
191
+ return layoutWithTitle .getMeasuredHeight () + context .getResources ().getDimensionPixelSize (R .dimen .sesl_popup_menu_item_bottom_padding ) - 5 ;
192
+ }
193
+ }
194
+
147
195
private void updatePopupSize () {
148
- listView .measure (ViewGroup .LayoutParams .WRAP_CONTENT , ViewGroup .LayoutParams .WRAP_CONTENT );
149
- int height = listView .getMeasuredHeight () + context .getResources ().getDimensionPixelSize (R .dimen .sesl_popup_menu_item_bottom_padding ) - 5 ;
150
- if (popupWindow .isShowing ()) popupWindow .update (getPopupMenuWidth (), height );
196
+ if (popupWindow .isShowing ()) popupWindow .update (getPopupMenuWidth (), getPopupMenuHeight ());
151
197
}
152
198
153
199
public void show () {
0 commit comments