使用PopupMenu实现弹出菜单

使用PopupMenu实现弹出菜单

一、目标

使用弹出菜单,完成文件夹收藏功能。

  • 我的笔记

  • 搜索

长按列表项,弹出菜单收藏文件夹。

二、体验地址

神马笔记最新版本:【神马笔记 版本1.3.0.apk

三、功能设计

收藏功能仅对文件夹有效,因此最近项目列表中,不会出现收藏功能。

另外,收藏功能是一个低频的操作,使用弹出菜单完成。

用户通过长按弹出菜单,完成收藏文件夹功能。

四、准备工作

1. PopupMenu

推荐阅读ayuhani的《Android 轻量化组件 PopupMenu 的使用》一文,非常详细地描述了PopupMenu的用法。

2. AlertDialog

推荐阅读菩萨笑了的《Android系统总结之---AlertDialog笔记》一文,总结非常到位。

五、组合起来

PopupMenuAlertDialog都能实现弹出菜单的功能,比较2种实现方式,PopupMenu更有指向性。

因此,采用PoupMenu方式。

1. 弹出菜单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
protected boolean onItemLongClick(RecordViewHolder viewHolder, RecordEntity item) {
int menuRes;

if (item.isTrash()) {
menuRes = R.menu.menu_trash;
} else if (item.isDirectory()) {
menuRes = R.menu.menu_folder;
} else {
menuRes = R.menu.menu_note;
}

if (menuRes == 0) {
return false;
}

PopupMenu popupMenu = new PopupMenu(parent.getActivity(), viewHolder.itemView);
popupMenu.inflate(menuRes);
if (menuRes == R.menu.menu_folder) {
FavoriteEntity ds = FavoriteEntity.obtain();
if (ds.get(item.getId()).isPresent()) {
popupMenu.getMenu().findItem(R.id.menu_cancel_fav).setVisible(true);
} else {
popupMenu.getMenu().findItem(R.id.menu_fav).setVisible(true);
}
}

popupMenu.setOnMenuItemClickListener(new RecordMenuItemClickListener(parent, item));
popupMenu.show();

{
SoftInputUtils.hide(parent.getActivity());
}

return true;
}

2. 处理菜单事件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
private static class RecordMenuItemClickListener extends MenuItemClickListener {

BaseRecordListFragment parent;
RecordEntity entity;

RecordMenuItemClickListener(BaseRecordListFragment f, RecordEntity entity) {

this.parent = f;
this.entity = entity;

this.put(R.id.menu_rename,
(item) -> parent.requestEdit(entity));

this.put(R.id.menu_move,
(item -> parent.requestMove(entity)));

this.put(R.id.menu_share,
(item -> parent.requestShare(entity)));

this.put(R.id.menu_fav, item -> parent.requestFavorite(entity, true));

this.put(R.id.menu_cancel_fav, item -> parent.requestFavorite(entity, false));
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
final void requestFavorite(RecordEntity entity, boolean value) {
FavoriteEntity ds = FavoriteEntity.obtain();
boolean result = ds.get(entity.getId()).isPresent();
if (!(result ^ value)) {
return;
}

{
String id = entity.getId();
if (value) {
ds.add(id);
} else {
ds.remove(id);
}

ds.save();
}

{
String hint;
if (value) {
hint = "已添加到个人收藏。";
} else {
hint = "已从个人收藏移除。";
}

Snackbar.make(recyclerView, hint, Snackbar.LENGTH_SHORT).show();
}
}

六、Finally

~君问穷通理~渔歌入浦深~