"ui";
// 全局配置对象
let config = {
option: 'option1',
textValue: '',
// 其他配置参数...
};
// 主界面UI
function createMainUI() {
ui.run(() => {
ui.layout(
<frame>
<dialog id="mainDialog" fixedToTop="true" autoCancel="false">
<vertical padding="16" gravity="center">
<text text="主界面" textSize="20sp" marginBottom="24" />
<linear layout_width="match_parent" gravity="center">
<button id="startBtn" text="开始" layout_width="0" layout_weight="1" marginRight="8"
/>
<button id="configBtn" text="配置" layout_width="0" layout_weight="1"
/>
<button id="exitBtn" text="退出" layout_width="0" layout_weight="1" marginLeft="8"
/>
</linear>
</vertical>
</dialog>
</frame>
);
// 设置按钮点击事件
ui.run(() => {
ui.findView('mainDialog').show();
// 开始按钮点击事件
ui.findView('startBtn').on('click', () => {
toast("开始执行任务");
// 这里添加开始执行的代码
});
// 配置按钮点击事件
ui.findView('configBtn').on('click', () => {
ui.findView('mainDialog').dismiss();
// 显示配置界面
setTimeout(() => {
createConfigUI();
}, 100);
});
// 退出按钮点击事件
ui.findView('exitBtn').on('click', () => {
ui.findView('mainDialog').dismiss();
// 退出应用逻辑
exit();
});
});
});
}
// 配置界面UI
function createConfigUI() {
ui.run(() => {
ui.layout(
<frame>
<dialog id="configDialog" fixedToTop="true" autoCancel="false">
<vertical padding="16" gravity="center">
<text text="参数配置" textSize="20sp" marginBottom="24" />
<!-- 单选框组 -->
<text text="选择一个选项:" marginBottom="8" />
<radiogroup id="radioGroup" orientation="vertical" marginBottom="16">
<radiobutton text="选项1" id="option1" />
<radiobutton text="选项2" id="option2" />
<radiobutton text="选项3" id="option3" />
</radiogroup>
<!-- 文本输入框 -->
<text text="输入文本:" marginBottom="8" />
<edittext
id="textInput"
hint="请输入文本"
marginBottom="24"
/>
<!-- 关闭按钮 -->
<button
id="closeConfigBtn"
text="关闭"
layout_width="match_parent"
/>
</vertical>
</dialog>
</frame>
);
// 显示配置对话框并设置事件
ui.run(() => {
ui.findView('configDialog').show();
// 设置单选框初始选中状态
ui.findView(config.option).setChecked(true);
// 设置文本输入框的值
ui.findView('textInput').setText(config.textValue);
// 关闭按钮点击事件
ui.findView('closeConfigBtn').on('click', () => {
// 保存配置
const radioGroup = ui.findView('radioGroup');
const checkedId = radioGroup.getCheckedRadioButtonId();
if (checkedId !== -1) {
const checkedRadio = ui.findView(checkedId);
config.option = checkedRadio.id();
}
config.textValue = ui.findView('textInput').getText();
// 关闭配置对话框
ui.findView('configDialog').dismiss();
// 显示主界面
setTimeout(() => {
createMainUI();
}, 100);
});
});
});
}
// 启动应用
function main() {
// 确保在UI线程中运行
ui.run(() => {
// 初始化UI
createMainUI();
});
}
// 执行主函数
main();
运行报错
17:45:00.357/D: { [JavaException: android.view.InflateException: org.xml.sax.SAXParseException: name expected (position:START_TAG <com.stardust.autojs.core.ui.widget.JsButton android:id='@+id/startBtn' android:text='开始' android:layout_width='0' android:layout_weight='1' android:layout_marginRight='8dp' android:onClick=' () => { toast('>@31:12 in java.io.InputStreamReader@6e3b7a2) ]
fileName: 'file:///android_asset/modules/ui.js',
lineNumber: 18 }
回答
文档地址 https://docs.hamibot.com/
你的代码有几个问题需要修正:
- 按钮的onClick属性不能直接使用箭头函数,这是Rhino引擎不支持的语法
- 布局XML中不能直接使用JavaScript代码
- 需要正确设置按钮的宽度和权重
以下是修正后的代码:
"ui";
// 全局配置对象
let config = {
option: 'option1',
textValue: '',
// 其他配置参数...
};
// 主界面UI
function createMainUI() {
ui.layout(
<frame>
<dialog id="mainDialog">
<vertical padding="16" gravity="center">
<text text="主界面" textSize="20sp" marginBottom="24"/>
<linear layout_width="match_parent" gravity="center">
<button id="startBtn" text="开始" layout_width="0" layout_weight="1" marginRight="8"/>
<button id="configBtn" text="配置" layout_width="0" layout_weight="1"/>
<button id="exitBtn" text="退出" layout_width="0" layout_weight="1" marginLeft="8"/>
</linear>
</vertical>
</dialog>
</frame>
);
ui.startBtn.click(function(){
toast("开始执行任务");
});
ui.configBtn.click(function(){
ui.mainDialog.dismiss();
setTimeout(createConfigUI, 100);
});
ui.exitBtn.click(function(){
ui.mainDialog.dismiss();
exit();
});
ui.mainDialog.show();
}
// 配置界面UI
function createConfigUI() {
ui.layout(
<frame>
<dialog id="configDialog">
<vertical padding="16" gravity="center">
<text text="参数配置" textSize="20sp" marginBottom="24"/>
<text text="选择一个选项:" marginBottom="8"/>
<radiogroup id="radioGroup" orientation="vertical" marginBottom="16">
<radiobutton text="选项1" id="option1"/>
<radiobutton text="选项2" id="option2"/>
<radiobutton text="选项3" id="option3"/>
</radiogroup>
<text text="输入文本:" marginBottom="8"/>
<edittext id="textInput" hint="请输入文本" marginBottom="24"/>
<button id="closeConfigBtn" text="关闭" layout_width="match_parent"/>
</vertical>
</dialog>
</frame>
);
ui[config.option].setChecked(true);
ui.textInput.setText(config.textValue);
ui.closeConfigBtn.click(function(){
config.option = ui.radioGroup.getCheckedRadioButtonId();
config.textValue = ui.textInput.getText();
ui.configDialog.dismiss();
setTimeout(createMainUI, 100);
});
ui.configDialog.show();
}
// 启动应用
createMainUI();
hamibot.exit();
主要修改:
- 移除了XML中的onClick属性
- 使用标准的ui.控件名.click(function(){...})方式绑定事件
- 简化了代码结构,移除了多余的ui.run()调用
- 直接使用ui.控件名访问视图对象
这样修改后应该可以正常运行了。