自定义菜单

更新时间: 2026/04/30 16:36:28

本文介绍如何在安卓平台上使用网易会议组件 NEMeetingKit 进行菜单定制。

功能介绍

NEMeetingKit 支持通过 NEMeetingOptions 对会议界面中的菜单项进行自定义,包括工具栏菜单、更多菜单和成员操作菜单。

菜单的自定义包括修改文本、定制图标、菜单排序、菜单新增与删除等操作。

菜单类型分为两种:

  • 单状态菜单:只有一个固定状态,单击后执行相应操作(例如:打开设置)。
  • 多状态菜单:有多个状态,单击后可在不同状态间切换(例如:麦克风开/关、摄像头开/关)。

自定义工具栏菜单

工具栏菜单位于会议界面底部和顶部的主要控制区域。

image.png

示例代码如下:

Java// 创建工具栏菜单 builder
NEMenuItemListBuilder toolbarMenuBuilder = NEMenuItemListBuilder.toolbarMenuBuilder();

// 创建菜单信息,包括菜单文本、浅色图标与深色图标
// 注意:建议准备两套图标,分别用于浅色模式和深色模式
NEMenuItemInfo menuItemInfo = new NEMenuItemInfo("菜单文案", R.drawable.light_icon, R.drawable.dark_icon);

// 创建一个单状态的菜单
// 参数说明:
// 1. ID: 101 - 自定义菜单 ID(使用大于 100 的整数值)
// 2. VISIBLE_ALWAYS - 菜单显示条件
// 3. menuItemInfo - 上面创建的菜单信息对象
NESingleStateMenuItem singleStateMenuItem = new NESingleStateMenuItem(
    101,
    NEMenuVisibility.VISIBLE_ALWAYS,
    menuItemInfo
);

// 添加到工具栏菜单中
toolbarMenuBuilder.addMenu(singleStateMenuItem);

// 配置入会选项对象
NEJoinMeetingOptions meetingOptions = new NEJoinMeetingOptions();
// 设置到会议选项中
meetingOptions.fullToolbarMenuItems = toolbarMenuBuilder.build();
// 加入会议
// params 应包含会议 ID 等会议参数
NEMeetingKit.getInstance().getMeetingService().joinMeeting(context, params, meetingOptions, callback);

自定义菜单 ID 应避免与 NEMenuIDs 中定义的内置菜单 ID 冲突。使用大于 100 的整数值作为自定义菜单 ID。如需修改或管理内置菜单,则应使用相应的内置菜单 ID 常量。

自定义更多菜单

更多菜单是指单击会议界面底部 更多 按钮后显示的菜单项。

image.png

示例代码如下:

Java// 创建更多菜单 builder
NEMenuItemListBuilder moreMenuBuilder = NEMenuItemListBuilder.moreMenuBuilder();

// 创建菜单信息,包括菜单文本、浅色图标与深色图标
NEMenuItemInfo menuItemInfo = new NEMenuItemInfo("菜单文案", R.drawable.light_icon, R.drawable.dark_icon);

// 创建一个单状态的菜单
// 参数说明:
// 1. ID: 102 - 自定义菜单 ID(使用大于 100 的整数值)
// 2. VISIBLE_ALWAYS - 菜单显示条件
// 3. menuItemInfo - 上面创建的菜单信息对象
NESingleStateMenuItem singleStateMenuItem = new NESingleStateMenuItem(
    102,
    NEMenuVisibility.VISIBLE_ALWAYS,
    menuItemInfo
);

// 添加到更多菜单列表中
moreMenuBuilder.addMenu(singleStateMenuItem);

// 配置入会选项对象
NEJoinMeetingOptions meetingOptions = new NEJoinMeetingOptions();
// 设置到会议选项中
meetingOptions.fullMoreMenuItems = moreMenuBuilder.build();
// 加入会议
NEMeetingKit.getInstance().getMeetingService().joinMeeting(context, params, meetingOptions, callback);

自定义成员上下文菜单

成员上下文菜单是指单击 管理参会者 图表后在管理参会者的页面中,单击某个成员后弹出的操作菜单。

image.png

示例代码如下:

Java// 创建成员操作菜单列表,首先获取内置菜单项列表(如静音、移出会议等)
List<NEMeetingMenuItem> memberActionMenuItems = NEActionMenuItems.getBuiltinActionMenuItemList();

// 创建菜单信息,提供菜单文本
// 注意:成员菜单暂不支持自定义图标,图标资源 ID 可设置为 0
NEMenuItemInfo menuItemInfo = new NEMenuItemInfo("菜单文案", 0);

// 创建一个单状态的菜单
NESingleStateMenuItem singleStateMenuItem = new NESingleStateMenuItem(
    103,
    NEMenuVisibility.VISIBLE_ALWAYS,
    menuItemInfo
);

// 添加到成员操作菜单列表
memberActionMenuItems.add(singleStateMenuItem);

NEJoinMeetingOptions meetingOptions = new NEJoinMeetingOptions();
// 设置到会议选项中
meetingOptions.memberActionMenuItems = memberActionMenuItems;
// 加入会议
NEMeetingKit.getInstance().getMeetingService().joinMeeting(context, params, meetingOptions, callback);

主动更新自定义菜单

在会议过程中,可以调用 updateInjectedMenuItem 根据需要实时更新已添加的自定义菜单。

示例代码如下:

Java// 创建新菜单信息
NEMenuItemInfo menuItemInfo = new NEMenuItemInfo("新菜单文案", 0);

// 创建一个单状态的菜单,使用已存在的菜单 ID 进行更新
// 菜单 ID 说明:
// 1. 对于内置菜单项,应使用 NEMenuIDs 中定义的常量,如 NEMenuIDs.MIC_MENU_ID
// 2. 对于自定义菜单项,必须使用之前添加到会议中的菜单 ID
// 3. 更新菜单时,必须使用已添加到会议中的菜单 ID,否则更新将无效
NESingleStateMenuItem menuItem = new NESingleStateMenuItem(
    103, // 此处使用之前添加的自定义菜单 ID
    NEMenuVisibility.VISIBLE_ALWAYS,
    menuItemInfo
);

// 更新相同菜单 ID 的菜单项
// callback 用于接收更新结果
NEMeetingKit.getInstance().getMeetingService().updateInjectedMenuItem(menuItem, callback);

监听菜单单击事件

要响应自定义菜单的单击事件,您需要设置菜单单击监听器。

示例代码如下:

Java// 创建菜单单击事件监听器
NEMeetingOnInjectedMenuItemClickListener menuItemClickListener = new NEMeetingOnInjectedMenuItemClickListener() {
    @Override
    public void onInjectedMenuItemClick(Context context, NEMenuClickInfo clickInfo,
                                       NEMeetingInfo meetingInfo, NEMenuStateController stateController) {
        // 根据菜单 ID 处理不同的菜单单击事件
        switch (clickInfo.itemId) {
            case 101:
                // 处理工具栏自定义菜单单击
                Toast.makeText(context, "自定义功能被单击", Toast.LENGTH_SHORT).show();
                break;
            case 102:
                // 处理更多菜单自定义项单击
                showAdvancedSettings(context);
                break;
            case 103:
                // 处理成员操作菜单自定义项单击
                // clickInfo.memberId 包含被单击操作的成员 ID
                focusMember(clickInfo.memberId);
                break;
        }

        // 如果是多状态菜单,可以通过 stateController 控制菜单状态迁移
        // 例如将菜单切换到选中状态:
        // stateController.updateState(clickInfo.itemId, NEMenuItemState.SELECTED);
    }
};

// 重要:设置菜单单击事件监听器,需要在加入会议前设置
// 如果在加入会议后设置,可能无法接收到菜单单击事件
NEMeetingKit.getInstance().getMeetingService().setOnInjectedMenuItemClickListener(menuItemClickListener);

相关参考

SDK 内置菜单项

NEMeetingKit 目前内置了以下菜单项,您可根据需要调整内置菜单项的位置、标题、图标和可见性。

菜单项
菜单 ID
是否允许在 Toolbar 菜单中显示
是否允许在 更多 展开菜单中显示
音频 MIC_MENU_ID
视频 CAMERA_MENU_ID
屏幕共享 SCREEN_SHARE_MENU_ID
参会者 PARTICIPANTS_MENU_ID
管理参会者 MANAGE_PARTICIPANTS_MENU_ID
切换视图 SWITCH_SHOW_TYPE_MENU_ID
邀请 INVITE_MENU_ID
聊天 CHAT_MENU_ID
白板 WHITEBOARD_MENU_ID
云录制 CLOUD_RECORD_MENU_ID
安全 SECURITY_MENU_ID
断开音频 DISCONNECT_AUDIO_MENU_ID
通知 NOTIFY_CENTER_MENU_ID
设置 SETTINGS_MENU_ID
反馈 FEEDBACK_MENU_ID
美颜 BEAUTY_MENU_ID
直播 LIVE_MENU_ID
虚拟背景 VIRTUAL_BACKGROUND_MENU_ID
同声传译 INTERPRETATION_MENU_ID
字幕 CAPTIONS_MENU_ID
转写 TRANSCRIPTION_MENU_ID
呼叫 SIP_CALL_MENU_ID
互动批注 ANNOTATION_MENU_ID
倒计时 COUNTDOWN_MENU_ID
合法的自定义注入菜单的起始 ID FIRST_INJECTED_MENU_ID
此文档是否对你有帮助?
有帮助
去反馈
  • 功能介绍
  • 自定义工具栏菜单
  • 自定义更多菜单
  • 自定义成员上下文菜单
  • 主动更新自定义菜单
  • 监听菜单单击事件
  • 相关参考
  • SDK 内置菜单项