使用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
~君问穷通理~渔歌入浦深~