自定义菜单
更新时间: 2026/04/30 16:36:28
本文介绍如何在安卓平台上使用网易会议组件 NEMeetingKit 进行菜单定制。
功能介绍
NEMeetingKit 支持通过 NEMeetingOptions 对会议界面中的菜单项进行自定义,包括工具栏菜单、更多菜单和成员操作菜单。
菜单的自定义包括修改文本、定制图标、菜单排序、菜单新增与删除等操作。
菜单类型分为两种:
- 单状态菜单:只有一个固定状态,单击后执行相应操作(例如:打开设置)。
- 多状态菜单:有多个状态,单击后可在不同状态间切换(例如:麦克风开/关、摄像头开/关)。
自定义工具栏菜单
工具栏菜单位于会议界面底部和顶部的主要控制区域。
示例代码如下:
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 常量。
自定义更多菜单
更多菜单是指单击会议界面底部 更多 按钮后显示的菜单项。
示例代码如下:
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);
自定义成员上下文菜单
成员上下文菜单是指单击 管理参会者 图表后在管理参会者的页面中,单击某个成员后弹出的操作菜单。
示例代码如下:
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 |
是 | 是 |
此文档是否对你有帮助?




