dialogs 对话框 — alert、confirm、prompt、build 详解
dialogs 模块总览
dialogs 模块提供了在脚本中弹出 Android 原生对话框的能力。与 E4X 界面不同,对话框是系统级弹窗,不需要脚本声明 "ui" 也能使用。
| 方法 | 类型 | 返回值 | 说明 |
|---|---|---|---|
dialogs.alert() | 提示框 | void | 只有一个确定按钮 |
dialogs.confirm() | 确认框 | boolean | 确定/取消 |
dialogs.prompt() | 输入框 | string/null | 让用户输入内容 |
dialogs.select() | 单选列表 | number | 选中索引 |
dialogs.multiSelect() | 多选列表 | number[] | 选中索引数组 |
dialogs.build() | 自定义 | Dialog | 完全自定义 |
dialogs.showFilePicker() | 文件选择器 | string/null | 选文件路径 |
alert — 提示框
最简单的对话框,只有「确定」一个按钮:
dialogs.alert(
"标题", // 可选
"这是一条提示信息",
"我知道了" // 按钮文字(默认"确定")
);
// 单参数版本 —— 只有信息和确定按钮
dialogs.alert("操作已完成");
confirm — 确认框
两个按钮,让用户选择确定或取消:
let result = dialogs.confirm(
"确认删除",
"确定要删除这条记录吗?此操作不可恢复。",
"删除", // 确定按钮文字
"取消" // 取消按钮文字
);
if (result) {
console.log("用户点了确定");
} else {
console.log("用户点了取消");
}
prompt — 输入框
弹出一个带输入框的对话框:
// 简单输入
let name = dialogs.prompt("请输入您的名字");
if (name !== null && name !== "") {
console.log("名字: " + name);
}
// 带默认值
let email = dialogs.prompt(
"邮箱",
"请输入邮箱地址",
"default@example.com" // 默认值
);
// 密码输入(隐藏显示)
let pwd = dialogs.prompt(
"密码",
"请输入密码",
"",
null,
"password" // 输入类型
);
prompt 返回值
| 用户操作 | 返回值 |
|---|---|
| 点确定 | 输入框内容(可能为空字符串) |
| 点取消 | null |
select — 单选列表
让用户从多个选项中选一个:
let choices = ["微信登录", "QQ登录", "手机号登录", "游客模式"];
let result = dialogs.select(
"选择登录方式", // 标题
choices // 选项数组
);
if (result !== -1) {
console.log("选择了: " + choices[result]);
} else {
console.log("用户取消了");
}
multiSelect — 多选列表
let features = ["自动签到", "自动清理", "自动备份", "自动回复"];
let selected = dialogs.multiSelect(
"选择功能", // 标题
features
);
// selected 是选中索引数组,如 [0, 2]
console.log("选中了: " + selected.map(i => features[i]).join(", "));
build — 自定义对话框
dialogs.build() 可以构建完全自定义的对话框:
let dialog = dialogs.build({
title: "自定义对话框标题",
content: "对话框正文内容",
// 三个按钮
positive: "确定",
negative: "取消",
neutral: "稍后再说",
// 按钮文字是否全大写(v6.7 新增)
positiveTextAllCaps: false,
negativeTextAllCaps: false,
neutralTextAllCaps: false,
// 宽度
customView: null, // 可自定义 E4X 布局
autoDismiss: true, // 点击按钮后是否自动关闭
cancelable: true, // 是否可以按返回键关闭
// 输入框模式
inputHint: "提示",
inputPrefill: "预填内容"
});
// 设置按钮点击回调
dialog.on("positive", () => {
console.log("点击了确定");
});
dialog.on("negative", () => {
console.log("点击了取消");
});
dialog.on("neutral", () => {
console.log("点击了中立按钮");
});
// 输入框模式的输入变化
dialog.on("input", (text) => {
console.log("当前输入: " + text);
});
// 显示对话框
dialog.show();
// 手动关闭
// dialog.dismiss();
build 的自定义视图
let dialog = dialogs.build({
title: "自定义视图对话框",
customView: (
<vertical padding="16">
<text text="这是自定义内容" textSize="16sp"/>
<button id="innerBtn" text="内嵌按钮"/>
</vertical>
),
positive: "确定"
});
// 在 build 中获取内嵌控件引用
// 需要在 ui.layout 上下文中使用
异步调用
部分对话框支持异步调用(不阻塞后续代码):
// 异步 alert
dialogs.alert("提示").then(() => {
console.log("对话框已关闭");
});
// 异步 confirm
dialogs.confirm("确认吗?").then(result => {
if (result) {
console.log("确定");
}
});
// 异步 prompt
dialogs.prompt("名字").then(name => {
console.log("用户输入: " + name);
});
异步对话框返回 Promise,可以用
.then()或await(需测试 Rhino 支持)。
文件选择器
// 打开系统文件选择器
let path = dialogs.showFilePicker({
title: "选择脚本文件",
type: "files", // files / folders / all
multiple: false // 是否多选
});
if (path) {
console.log("选择的文件: " + path);
}
实战:完整的设置向导
/**
* 脚本首次运行时的设置向导
*/
function setupWizard() {
// 第一步:确认使用
if (!dialogs.confirm(
"使用向导",
"这个向导将帮助你完成基本设置。\n点击确定继续,取消稍后手动设置。",
"开始", "跳过"
)) {
return;
}
// 第二步:选择运行频率
let choices = ["每分钟", "每 5 分钟", "每 15 分钟", "每小时"];
let freqIndex = dialogs.select("选择运行频率", choices);
if (freqIndex === -1) return;
// 第三步:选择功能(多选)
let features = ["自动签到", "自动清理", "自动备份"];
let selected = dialogs.multiSelect("选择要启用的功能", features);
// 第四步:确认用户名
let username = dialogs.prompt(
"设置用户名",
"请输入你的用户名",
"默认用户"
);
if (username === null) return;
// 保存设置
storage.put("setup", {
frequency: choices[freqIndex],
features: selected.map(i => features[i]),
username: username
});
dialogs.alert("设置完成", "配置已保存!");
}
setupWizard();
与 toast 的区别
| 特性 | toast | dialogs |
|---|---|---|
| 是否阻塞 | 否(短暂显示后自动消失) | 是(等待用户交互) |
| 用户交互 | 无(纯提示) | 按钮、输入、选择 |
| 样式 | 系统默认小气泡 | 系统标准对话框 |
| 适用场景 | 状态提示、短暂反馈 | 确认操作、收集输入、重要提醒 |