Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PopupMenu in Android #200

Open
soapgu opened this issue May 22, 2023 · 0 comments
Open

PopupMenu in Android #200

soapgu opened this issue May 22, 2023 · 0 comments
Labels
安卓 安卓

Comments

@soapgu
Copy link
Owner

soapgu commented May 22, 2023

  • 安卓中的菜单

  • 菜单是一种资源
    菜单也是资源(Resource)的一种。通过ide可以查看相关资源
图片 安卓的资源体系对兼容性和本地化设置比较成熟。关于设备的兼用性和多语言的解决方案是成功的

常用的菜单有下面几种

图片 位置比较老土,暂时没用过,略。 - [上下文菜单](https://developer.android.google.cn/guide/topics/ui/menus?hl=zh-cn#context-menu) 基本上和WPF的Context Menu的场景是一样的,是关联到某一个View上面的菜单 需要调用[registerForContextMenu()](https://developer.android.google.cn/reference/android/app/Activity?hl=zh-cn#registerForContextMenu(android.view.View))方法来实现注册,这里也暂时略
  • 弹出式菜单
    这就是本篇介绍重点。

  • 菜单组
    菜单也是可以分组的,菜单也可以在组内设置单选项和多选项的。这里暂时略

  • 基于 Intent 的菜单项
    和Intent关联的菜单,比如拍照的Intent有“照相机”和“美图秀秀”,这里也暂时略。

  • 弹出式菜单(PopupMenu)代码实现

好接下来讲一下实现方式

  1. 创建菜单资源
    如果是什么菜单类型,我们都需要创建“菜单”资源,这是一个xml,根结点是
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/share_item" android:title="@string/share" />
    <item android:id="@+id/pdf_item" android:title="翻页" />
</menu>

其中title是菜单的文字,还能设置菜单的图片,使用android:icon来设置
菜单也是支持子菜单嵌套的,item的Content里面可以设置menu作为子菜单

  1. 创建弹出菜单并显示
        PopupMenu popupMenu = new PopupMenu(requireContext(),view.findViewById(R.id.popupButton));
        popupMenu.getMenuInflater().inflate(R.menu.file_popup, popupMenu.getMenu());
        popupMenu.show();

其中构造函数的第二个参数是菜单“锚定控件”,一般空间够就在下方展开。
一般常用的使用inflate函数来展开菜单资源的,也可以使用popupMenu.getMenu().add纯代码的方式添加。

  1. 控制弹出式菜单
    对于弹出式菜单的控制主要有两方面。
  • 动态控制菜单

从需求角度上讲,菜单有“动态性”设置,根据不同的数据有个菜单项目是有条件的显示/隐藏。

       popupMenu.getMenu().getItem(0).setVisible(true);
       boolean showPdfItem = this.viewModel.isPdf();
       popupMenu.getMenu().getItem(1).setVisible(showPdfItem);
       if(showPdfItem){
           popupMenu.getMenu().getItem(1).setTitle(this.viewModel.getPdfItemTitle());
       }

这里需要“动态”控制菜单的Title和显示

  • 响应菜单点击事件
popupMenu.setOnMenuItemClickListener(item -> {
            switch (item.getItemId()){
                case R.id.share_item:
                    NavDirections action = ViewerFragmentDirections.actionViewerFragmentToShareFragment( id );
                    this.navController.navigate(action);
                    break;
                case R.id.pdf_item:
                    this.viewModel.switchPdfViewMode();
                    break;
            }
            return true;
        });

通过setOnMenuItemClickListener可以监听菜单的点击。
这里因为没办法使用binding了,所以只能用比较“原始”的switch case的方式来写代码

@soapgu soapgu added the 安卓 安卓 label May 22, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
安卓 安卓
Projects
None yet
Development

No branches or pull requests

1 participant