使用PopupMenu实现弹出菜单

版权声明:个人原创,欢迎转载。 https://blog.csdn.net/chuyangchangxi/article/details/86547342

一、目标

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

  • 我的笔记
    在这里插入图片描述

  • 搜索
    在这里插入图片描述

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

二、体验地址

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

三、功能设计

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

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

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

四、准备工作

1. PopupMenu

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

2. AlertDialog

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

五、组合起来

PopupMenuAlertDialog都能实现弹出菜单的功能,比较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

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

猜你喜欢

转载自blog.csdn.net/chuyangchangxi/article/details/86547342