App Inventor 2 PopupMenu与列表选择器自定义教程

« 返回首页

概述

App Inventor没有内置PopupMenu组件。但可以通过ListPicker、Spinner和自定义方案实现类似效果。

方案 组件 弹出方式 可自定义程度
ListPicker 内置 全屏列表
Spinner 内置 下拉菜单
自定义弹窗 Alert + ListView 底部弹窗
扩展PopupMenu 扩展 系统菜单

ListPicker方案

基本用法

当 Screen1.初始化
  设 ListPicker1.元素 = ["选项一", "选项二", "选项三", "选项四"]

当 ListPicker1.准备打开()
  ' 动态设置选项
  设 动态列表 = TinyDB1.获取值("menu_items", 创建空列表)
  设 ListPicker1.元素 = 动态列表

当 ListPicker1.选择完成(选中项)
  标签_结果.文本 = "你选择了:" & 选中项

动态文字

ListPicker的元素可以随时动态更改:

当 按钮_更新菜单.被点击
  设 新菜单 = ["今日推荐", "热门课程", "最新发布", "我的收藏"]
  设 ListPicker1.元素 = 新菜单

设置标题和背景色

当 ListPicker1.准备打开()
  设 ListPicker1.标题 = "请选择操作"
  设 ListPicker1.背景颜色 = 白色
  设 ListPicker1.文本颜色 = 黑色

Spinner方案

Spinner是一个下拉选择框,不会全屏弹出:

当 Screen1.初始化
  设 Spinner1.元素 = ["选项A", "选项B", "选项C"]

当 Spinner1.选择完成(选中项)
  标签_结果.文本 = 选中项

注意:Spinner在选中一项后无法取消选择,且无法自定义每项的样式。

自定义弹窗方案(推荐)

使用一个隐藏的VerticalArrangement模拟弹出菜单:

界面设计

Screen1
├── 按钮菜单(触发按钮)
├── 水平布局_遮罩(半透明黑色背景,覆盖全屏)
│   └── 垂直布局_菜单(白色背景,底部弹出)
│       ├── 按钮_选项1
│       ├── 按钮_选项2
│       ├── 按钮_选项3
│       └── 按钮_取消

积木块代码

设 菜单可见 = false

当 按钮_菜单.被点击
  设 菜单可见 = true
  设 水平布局_遮罩.可见 = true
  ' 动态设置按钮文字
  设 按钮_选项1.文本 = 从字典 菜单项 获取 "option1"
  设 按钮_选项2.文本 = 从字典 菜单项 获取 "option2"
  设 按钮_选项3.文本 = 从字典 菜单项 获取 "option3"

当 按钮_选项1.被点击
  调用 处理选择(1)
  调用 关闭菜单()

当 按钮_选项2.被点击
  调用 处理选择(2)
  调用 关闭菜单()

当 按钮_选项3.被点击
  调用 处理选择(3)
  调用 关闭菜单()

当 按钮_取消.被点击
  调用 关闭菜单()

定义 关闭菜单()
  设 菜单可见 = false
  设 水平布局_遮罩.可见 = false

动态生成菜单项

设 菜单数据 = [
  {icon: "📋", text: "复制"},
  {icon: "✂️", text: "剪切"},
  {icon: "📌", text: "粘贴"},
  {icon: "🗑️", text: "删除"},
  {icon: "📤", text: "分享"}
]

当 按钮_菜单.被点击
  ' 使用ListView显示动态菜单
  设 ListView_菜单.元素 = 菜单数据.map(显示函数)
  设 水平布局_遮罩.可见 = true

当 ListView_菜单.选择完成(选中位置, 选中项)
  设 选中索引 = 选中位置
  调用 关闭菜单()
  如果 选中索引 = 1
    调用 执行复制()
  否则 如果 选中索引 = 2
    调用 执行剪切()
  否则 如果 选中索引 = 3
    调用 执行粘贴()
  否则 如果 选中索引 = 4
    调用 执行删除()
  否则 如果 选中索引 = 5
    调用 执行分享()

修改列表选择器界面大小

ListPicker默认全屏显示。控制大小的方法:

方案一:使用Theme设置

在Screen属性中设置 Theme = "DeviceDefault",ListPicker会使用系统默认样式。

方案二:改用自定义弹窗

如需要精确控制大小,不用ListPicker,改用自定义的Visible/Hidden布局。

方案三:使用Notifier列表选择

当 按钮_选择.被点击
  调用 Notifier1.显示选择对话框(
    "请选择",                    ' 标题
    "选择一个选项",              ' 消息
    ["选项A", "选项B", "选项C"], ' 按钮列表
    false                        ' 是否可取消
  )

当 Notifier1.选择完成(选择)
  标签_结果.文本 = "选择了:" & 选择

Notifier的选择对话框可以自定义按钮文字,但选项数量有限(通常3-5个按钮)。

常见问题

Q1: ListPicker无法设置每项的颜色?

ListPicker是系统组件,无法单独设置每项样式。需要自定义方案。

Q2: 如何实现右键菜单(长按弹出)?

当 标签_内容.被长按()
  调用 Notifier1.显示选择对话框("操作", "", ["复制", "粘贴", "删除"], false)

Q3: Spinner选中后颜色不变?

Spinner默认只显示选中文本。如需高亮效果,用自定义方案。

总结

需求 推荐方案
简单选择 ListPicker
下拉选择 Spinner
自定义菜单 隐藏布局模拟弹窗
长按菜单 Notifier + 选择对话框
少量选项 Notifier(3-5个按钮)

版权声明:MIT App Inventor 官方文档采用 CC BY-SA 4.0 授权,本文档由 ai2claw 🐝 整理。

文档反馈