Skip to content

Commit 7ca84ba

Browse files
committed
feat(menu): 实现分组菜单功能
- 新增 GroupedFloatMenu 类,用于显示分组菜单 - 在 MainActivity 中添加测试代码,展示分组菜单的使用- 新增 MenuUtil 类,提供菜单显示的工具方法 - 删除了无用的 ExampleInstrumentedTest 文件
1 parent 57cb170 commit 7ca84ba

File tree

5 files changed

+197
-53
lines changed

5 files changed

+197
-53
lines changed

app/src/androidTest/java/com/noober/floatmenu/ExampleInstrumentedTest.java

Lines changed: 0 additions & 26 deletions
This file was deleted.

app/src/main/java/com/noober/floatmenu/MainActivity.java

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
import com.noober.floatmenu.dummy.DummyContent;
1515
import com.noober.menu.FloatMenu;
16+
import com.noober.menu.MenuUtil;
1617

1718
import java.util.ArrayList;
1819
import java.util.List;
@@ -73,11 +74,36 @@ public void onClick(View v, int position) {
7374
Toast.makeText(MainActivity.this, "菜单"+position, Toast.LENGTH_SHORT).show();
7475
}
7576
});
77+
List<MenuUtil.IMenu<String>> menus = new ArrayList<>();
78+
for (int i = 0; i < 50; i++) {
79+
int finalI = i;
80+
menus.add(new MenuUtil.IMenu<String>() {
81+
@Override
82+
public String text() {
83+
return "菜单" + finalI;
84+
}
85+
86+
@Override
87+
public String groupName() {
88+
return "group" + (finalI / 3);
89+
}
90+
91+
@Override
92+
public void onMenuClicked(int position, String bean) {
93+
Toast.makeText(MainActivity.this,
94+
"菜单"+position, Toast.LENGTH_SHORT).show();
95+
}
96+
});
97+
}
98+
99+
100+
76101

77102
btn1.setOnClickListener(new View.OnClickListener() {
78103
@Override
79104
public void onClick(View v) {
80-
floatMenu.show();
105+
//floatMenu.show();
106+
MenuUtil.showMenu(btn1, menus, "test");
81107
}
82108
});
83109

menu/src/androidTest/java/com/noober/menu/ExampleInstrumentedTest.java

Lines changed: 0 additions & 26 deletions
This file was deleted.
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package com.noober.menu;
2+
3+
import android.view.View;
4+
5+
import com.noober.menu.group.GroupedFloatMenu;
6+
7+
import java.util.ArrayList;
8+
import java.util.HashMap;
9+
import java.util.List;
10+
import java.util.Map;
11+
12+
/**
13+
* @author: Administrator
14+
* @date: 2022/2/2
15+
* @desc: //todo
16+
*/
17+
public class MenuUtil {
18+
19+
public static <T> void showMenu(View targetView, List<IMenu<T>> menus, T info) {
20+
// 按 groupName 分组
21+
Map<String, List<IMenu<T>>> groupedMenus = new HashMap<>();
22+
for (IMenu<T> menu : menus) {
23+
String groupName = menu.groupName(); // 假设 IMenu 接口新增了 groupName 方法
24+
if (!groupedMenus.containsKey(groupName)) {
25+
groupedMenus.put(groupName, new ArrayList<>());
26+
}
27+
groupedMenus.get(groupName).add(menu);
28+
}
29+
30+
// 构造 GroupedFloatMenu 所需的数据结构
31+
List<GroupedFloatMenu.MenuGroup> menuGroups = new ArrayList<>();
32+
for (Map.Entry<String, List<IMenu<T>>> entry : groupedMenus.entrySet()) {
33+
String groupName = entry.getKey();
34+
List<GroupedFloatMenu.MenuItem> menuItems = new ArrayList<>();
35+
for (IMenu<T> menu : entry.getValue()) {
36+
menuItems.add(new GroupedFloatMenu.MenuItem(menu.text(), v -> menu.onMenuClicked(-1, info)));
37+
}
38+
menuGroups.add(new GroupedFloatMenu.MenuGroup(groupName, menuItems));
39+
}
40+
41+
// 显示分组菜单
42+
GroupedFloatMenu groupedFloatMenu = new GroupedFloatMenu(targetView.getContext(), menuGroups);
43+
groupedFloatMenu.showAsDropDown(targetView);
44+
}
45+
46+
47+
48+
49+
50+
public interface IMenu<T>{
51+
String text();
52+
default String groupName() {
53+
return "";
54+
}
55+
void onMenuClicked(int position,T bean);
56+
}
57+
}
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
package com.noober.menu.group;
2+
3+
import android.content.Context;
4+
import android.graphics.Color;
5+
import android.util.TypedValue;
6+
import android.view.Gravity;
7+
import android.view.View;
8+
import android.view.ViewGroup;
9+
import android.widget.GridLayout;
10+
import android.widget.LinearLayout;
11+
import android.widget.PopupWindow;
12+
import android.widget.TextView;
13+
14+
import java.util.ArrayList;
15+
import java.util.HashMap;
16+
import java.util.List;
17+
import java.util.Map;
18+
19+
public class GroupedFloatMenu extends PopupWindow {
20+
21+
private Context context;
22+
private List<MenuGroup> menuGroups;
23+
24+
public GroupedFloatMenu(Context context, List<MenuGroup> menuGroups) {
25+
super(context);
26+
this.context = context;
27+
this.menuGroups = menuGroups;
28+
init();
29+
}
30+
31+
private void init() {
32+
LinearLayout mainLayout = new LinearLayout(context);
33+
mainLayout.setOrientation(LinearLayout.VERTICAL);
34+
mainLayout.setPadding(20, 20, 20, 20);
35+
36+
for (MenuGroup group : menuGroups) {
37+
// 添加组名
38+
TextView groupNameView = new TextView(context);
39+
groupNameView.setText(group.getGroupName());
40+
groupNameView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16);
41+
groupNameView.setTextColor(Color.BLACK);
42+
groupNameView.setPadding(0, 10, 0, 10);
43+
mainLayout.addView(groupNameView);
44+
45+
// 添加 GridLayout
46+
GridLayout gridLayout = new GridLayout(context);
47+
gridLayout.setColumnCount(3); // 每行显示3个菜单项
48+
gridLayout.setRowCount((int) Math.ceil(group.getItems().size() / 3.0));
49+
50+
for (MenuItem menuItem : group.getItems()) {
51+
TextView itemTextView = new TextView(context);
52+
itemTextView.setText(menuItem.getItem());
53+
itemTextView.setGravity(Gravity.CENTER);
54+
itemTextView.setPadding(10, 10, 10, 10);
55+
itemTextView.setBackgroundResource(android.R.drawable.btn_default);
56+
itemTextView.setOnClickListener(menuItem.getOnClickListener());
57+
58+
GridLayout.LayoutParams params = new GridLayout.LayoutParams();
59+
params.width = 0;
60+
params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
61+
params.columnSpec = GridLayout.spec(GridLayout.UNDEFINED, 1f);
62+
params.setMargins(5, 5, 5, 5);
63+
itemTextView.setLayoutParams(params);
64+
65+
gridLayout.addView(itemTextView);
66+
}
67+
68+
mainLayout.addView(gridLayout);
69+
}
70+
71+
setContentView(mainLayout);
72+
setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);
73+
setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
74+
setFocusable(true);
75+
setBackgroundDrawable(null);
76+
}
77+
78+
public static class MenuGroup {
79+
private String groupName;
80+
private List<MenuItem> items;
81+
82+
public MenuGroup(String groupName, List<MenuItem> items) {
83+
this.groupName = groupName;
84+
this.items = items;
85+
}
86+
87+
public String getGroupName() {
88+
return groupName;
89+
}
90+
91+
public List<MenuItem> getItems() {
92+
return items;
93+
}
94+
}
95+
96+
public static class MenuItem {
97+
private String item;
98+
private View.OnClickListener onClickListener;
99+
100+
public MenuItem(String item, View.OnClickListener onClickListener) {
101+
this.item = item;
102+
this.onClickListener = onClickListener;
103+
}
104+
105+
public String getItem() {
106+
return item;
107+
}
108+
109+
public View.OnClickListener getOnClickListener() {
110+
return onClickListener;
111+
}
112+
}
113+
}

0 commit comments

Comments
 (0)