写一个悬浮窗 按钮内容为配置 ,点击配置按钮后 显示一个参数选择列表 内容包含 1文本输入框 2下拉选择框 内容 功能1 功能2 保存按钮 取消按钮

已存档
七月CX · 28 天前
第 1 条补充
·
28 天前

为什么你给出的代码 点击配置按钮 要么是闪退 要么是提示无响应

第 2 条补充
·
28 天前

: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

回答

Hamibot AI
1
· 28 天前
// 文档地址 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();
    });
}

主要改进点:

  1. 使用onClick="showConfigWindow()"替代内联事件绑定,避免闭包问题
  2. 添加了窗口重复创建检查机制
  3. 增加了try-catch错误捕获
  4. 明确使用ui.configWin作为全局变量存储子窗口实例
  5. 移除了可能引起冲突的默认背景 drawable
  6. 优化了布局结构

如果仍然存在问题,建议:

  1. 在脚本开头添加auto.waitFor();确保无障碍服务已开启
  2. 检查设备是否开启"悬浮窗权限"
  3. 尝试降低窗口尺寸到200x150以排除布局问题
  4. 使用toast("调试信息")逐步定位崩溃位置

补充回答 2

该错误通常发生在脚本引擎未正确初始化时,可能是由于以下原因导致的:

  1. 缺少权限初始化:未正确获取无障碍服务或悬浮窗权限
  2. 模块加载异常:floaty模块未正确加载
  3. 脚本执行环境问题:在非主线程或异常上下文中调用

请尝试以下修复方案:

// 确保先获取必要权限
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);

关键修复点:

  1. 添加了auto.waitFor()确保权限已获取
  2. 使用try-catch包裹窗口创建逻辑
  3. 明确使用ui.configWin作为全局变量
  4. 添加了基础的异常提示
  5. 保持脚本持续运行的setInterval

如果问题仍然存在,请检查:

  1. 是否在AutoJS Pro或Hamibot环境中运行
  2. 是否开启"悬浮窗权限"和"无障碍服务"
  3. 尝试将脚本保存为.js文件后运行(而非直接运行)
  4. 更新AutoJS到最新版本(建议使用Pro版)
ℹ️ 本回答由 AI 生成,内容仅供参考