使用PopupMenu实现弹出菜单
使用PopupMenu实现弹出菜单
一、目标
使用弹出菜单,完成文件夹收藏功能。
-
我的笔记
-
搜索
长按列表项,弹出菜单收藏文件夹。
二、体验地址
神马笔记最新版本:【神马笔记 版本1.3.0.apk】
三、功能设计
收藏功能仅对文件夹有效,因此最近项目列表中,不会出现收藏功能。
另外,收藏功能是一个低频的操作,使用弹出菜单完成。
用户通过长按弹出菜单,完成收藏文件夹功能。
四、准备工作
1. PopupMenu
推荐阅读ayuhani的《Android 轻量化组件 PopupMenu 的使用》一文,非常详细地描述了PopupMenu的用法。
2. AlertDialog
推荐阅读菩萨笑了的《Android系统总结之—AlertDialog笔记》一文,总结非常到位。
五、组合起来
PopupMenu
和AlertDialog
都能实现弹出菜单的功能,比较2种实现方式,PopupMenu
更有指向性。
因此,采用PoupMenu
方式。
1. 弹出菜单
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. 处理菜单事件
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));
}
}
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
~君问穷通理~渔歌入浦深~