写一个悬浮窗 按钮内容为配置 ,点击配置按钮后 显示一个参数选择列表 内容包含 1文本输入框 2下拉选择框 内容 功能1 功能2 保存按钮 取消按钮
为什么你给出的代码 点击配置按钮 要么是闪退 要么是提示无响应
:59:50.914/E: Wrapped java.lang.NullPointerException: Attempt to invoke virtual method 'com.stardust.autojs.runtime.ScriptRuntime com.stardust.autojs.engine.RhinoJavaScriptEngine.getRuntime()' on a null object reference (file:///android_asset/modules/floaty.js#9)
Wrapped java.lang.NullPointerException: Attempt to invoke virtual method 'com.stardust.autojs.runtime.ScriptRuntime com.stardust.autojs.engine.RhinoJavaScriptEngine.getRuntime()' on a null object reference
at file:///android_asset/modules/floaty.js:9:0
at 685f66ce19934fa13300b8aa.js:5:0
回答
// 文档地址 https://docs.hamibot.com/
var mainWin = floaty.window(
<vertical>
<button id="configBtn" text="配置" />
</vertical>
);
mainWin.configBtn.click(function() {
// 创建参数配置窗口
var configWin = floaty.window(
<vertical>
<input id="textInput" hint="请输入文本" />
<spinner id="selectBox" android:entries="功能1,功能2" />
<button id="saveBtn" text="保存" />
<button id="cancelBtn" text="取消" />
</vertical>
);
// 保存按钮逻辑
configWin.saveBtn.click(function() {
var textValue = configWin.textInput.getText();
var selectValue = configWin.selectBox.getSelectedItem();
toast("保存成功\n文本内容:" + textValue + "\n选择功能:" + selectValue);
configWin.close();
});
// 取消按钮逻辑
configWin.cancelBtn.click(function() {
configWin.close();
});
// 设置配置窗口样式
configWin.setSize(300, 200);
configWin.setPosition(100, 100);
});
补充回答 1
根据你的描述,问题可能出在悬浮窗的创建方式或事件绑定逻辑上。以下是修改后的兼容性优化版本,并添加了错误处理:
// 文档地址 https://docs.hamibot.com/
var mainWin = floaty.window(
<vertical>
<button text="配置" onClick="showConfigWindow()" />
</vertical>
);
// 主窗口保持后台运行
mainWin.setBackgroundDrawable(null);
function showConfigWindow() {
// 避免重复创建窗口
if (ui.configWin) {
ui.configWin.close();
}
ui.configWin = floaty.window(
<vertical>
<input id="textInput" hint="请输入文本" />
<spinner id="selectBox" android:entries="功能1,功能2" />
<linear>
<button id="saveBtn" text="保存" />
<button id="cancelBtn" text="取消" />
</linear>
</vertical>
);
// 设置窗口参数
ui.configWin.setSize(300, 200);
ui.configWin.setPosition(100, 100);
// 保存按钮逻辑
ui.configWin.saveBtn.click(function() {
try {
var textValue = ui.configWin.textInput.getText();
var selectValue = ui.configWin.selectBox.getSelectedItem();
toast("保存成功\n文本内容:" + textValue + "\n选择功能:" + selectValue);
} catch (e) {
toast("保存操作失败:" + e);
} finally {
ui.configWin.close();
}
});
// 取消按钮逻辑
ui.configWin.cancelBtn.click(function() {
ui.configWin.close();
});
}
主要改进点:
- 使用
onClick="showConfigWindow()"
替代内联事件绑定,避免闭包问题 - 添加了窗口重复创建检查机制
- 增加了try-catch错误捕获
- 明确使用
ui.configWin
作为全局变量存储子窗口实例 - 移除了可能引起冲突的默认背景 drawable
- 优化了布局结构
如果仍然存在问题,建议:
- 在脚本开头添加
auto.waitFor();
确保无障碍服务已开启 - 检查设备是否开启"悬浮窗权限"
- 尝试降低窗口尺寸到200x150以排除布局问题
- 使用
toast("调试信息")
逐步定位崩溃位置
补充回答 2
该错误通常发生在脚本引擎未正确初始化时,可能是由于以下原因导致的:
- 缺少权限初始化:未正确获取无障碍服务或悬浮窗权限
- 模块加载异常:floaty模块未正确加载
- 脚本执行环境问题:在非主线程或异常上下文中调用
请尝试以下修复方案:
// 确保先获取必要权限
auto.waitFor();
// 修复后的完整示例
var mainWin = floaty.window(
<vertical>
<button text="配置" onClick="showConfigWindow()" />
</vertical>
);
// 保持主窗口不被关闭
mainWin.setBackgroundDrawable(null);
function showConfigWindow() {
// 避免重复创建窗口
if (ui.configWin) {
ui.configWin.close();
}
// 使用try-catch包裹关键代码
try {
ui.configWin = floaty.window(
<vertical>
<input id="textInput" hint="请输入文本" />
<spinner id="selectBox" android:entries="功能1,功能2" />
<linear>
<button id="saveBtn" text="保存" />
<button id="cancelBtn" text="取消" />
</linear>
</vertical>
);
// 设置窗口参数
ui.configWin.setSize(300, 200);
ui.configWin.setPosition(100, 100);
// 保存按钮逻辑
ui.configWin.saveBtn.click(function() {
var textValue = ui.configWin.textInput.getText();
var selectValue = ui.configWin.selectBox.getSelectedItem();
toast("保存成功\n文本内容:" + textValue + "\n选择功能:" + selectValue);
ui.configWin.close();
});
// 取消按钮逻辑
ui.configWin.cancelBtn.click(function() {
ui.configWin.close();
});
} catch (e) {
// 添加异常捕获
toast("窗口创建失败:" + e);
}
}
// 保持脚本持续运行
setInterval(() => {}, 1000);
关键修复点:
- 添加了
auto.waitFor()
确保权限已获取 - 使用try-catch包裹窗口创建逻辑
- 明确使用
ui.configWin
作为全局变量 - 添加了基础的异常提示
- 保持脚本持续运行的setInterval
如果问题仍然存在,请检查:
- 是否在AutoJS Pro或Hamibot环境中运行
- 是否开启"悬浮窗权限"和"无障碍服务"
- 尝试将脚本保存为
.js
文件后运行(而非直接运行) - 更新AutoJS到最新版本(建议使用Pro版)