一、先看目标与现状
本教程讲的是火山安卓的界面组件封装,不是 Windows 视窗或 MFC 控件。目标是把常用界面能力整理成独立组件,让普通使用者只需在窗口中声明变量并调用中文方法。
二、五个基本概念
| 名称 | 通俗解释 | 在本项目中 |
|---|---|---|
| 组件类 | 一个可重复使用的界面“零件”,里面写外观和方法。 | 类 统一按钮 |
| 基础类 | 新零件继承谁的能力。继承按钮就保留按钮的原生行为。 | 基础类 = 按钮 |
| 公开方法 | 外部代码能调用的命令。 | 设置主要样式 ("立即体验") |
| 窗口变量 | 窗口里实际放置的一个组件实例,类似给零件取名字。 | 示例按钮 |
| 设计器分类 | 左侧拖拽工具箱里的分组名称。 | uni-ui 组件 |
关键区别:写好一个 `.wsv` 文件,只代表有源码。加入项目、设计器能找到、完整编译、安卓上实际运行,是四次独立检查。
三、准备软件与工程
- 打开火山安卓开发环境。
在 Windows 上启动火山开发平台。官方新手教程的建项目路径为“文件 → 新建 → 项目”,选择“空白安卓程序”和“空窗口”。已有工程可直接打开桌面交付目录里的解决方案文件。
- 打开当前案例。
远程桌面交付目录:C:\Users\Administrator\Desktop\火山安卓项目交付。打开案例\uninativedemo.vsln。左侧项目树应看到
main.wsv、uni_button.wsv等文件。 - 确认基础模块。
项目树的“模块”下应有“Java基本类”和“安卓基本类”。没有这两个模块,安卓控件名称可能无法识别。
- 准备模拟器。
远程电脑已安装 MuMu。测试时先启动模拟器,再编译或安装 APK。新建自己的项目时,使用自己的 Android 包名和签名配置。
main.v;本案例实际源文件是 main.wsv。以当前工程项目树中的文件名为准,不要把文本硬改成另一种扩展名。四、认清目录和文件
火山安卓项目交付\ ├─ 安卓组件库\ │ ├─ uni_button.wsv ← 已验证的统一按钮源码 │ ├─ 卡片组件.wsv ← 初版容器组件 │ ├─ 列表组件.wsv ← 初版容器组件 │ ├─ 表格组件.wsv ← 初版容器组件 │ └─ 其他初版组件... ├─ 案例\ │ ├─ uninativedemo.vsln ← 双击它打开解决方案 │ ├─ uninativedemo\ │ │ ├─ uninativedemo.vprj ← 项目结构文件 │ │ └─ src\ │ │ ├─ main.wsv ← 案例窗口和调用代码 │ │ ├─ uni_button.wsv ← 加入案例工程的组件源码 │ │ └─ 其他源码... │ └─ uni_button_测试.apk ← 独立测试包,非正式发布包 └─ UniApp组件对齐清单.md ← 逐项验收状态
| 文件 | 用途 | 能否只靠它使用组件 |
|---|---|---|
.wsv / .v | 火山源文件,编写类、方法、窗口和布局。 | 还要加入正确的安卓工程并编译。 |
.vprj | 工程中有哪些源文件、模块和工程设置。 | 不能代替组件源码。 |
.vsln | 打开整套解决方案的入口。 | 不能代替组件源码。 |
.apk | 编译后装到安卓设备的应用。 | 只能运行,不能替代可编辑源码。 |
.dll | 某些底层能力可能需要的动态库。 | 本按钮示例只用火山安卓源码,没有单独 DLL。 |
“组件库”和“案例”分开,是为了同一个组件未来能放进多个应用。案例工程中的 uni_button.wsv 是工程已引用的副本;修改后要同步这两处,避免一个新一个旧。
五、逐行理解按钮组件为什么这样写
本项目的按钮类写在 uni_button.wsv。它继承火山原有的 按钮,所以原有点击能力仍在;我们只增加五个简单的中文样式方法。
| 源码片段 | 作用 | 少写了会怎样 |
|---|---|---|
包 火山Uni.界面 | 给类一个代码包位置。 | 包名混乱容易出现同名类冲突。 |
类 统一按钮 <公开 基础类 = 按钮 ...> | 定义一个能被工程引用的公开按钮类。 | 外部窗口无法把它当作按钮组件用。 |
@安卓.窗口组件.布局配置 | 告诉安卓布局系统这个类映射到哪个原生控件、放在哪个设计器分类。 | 布局生成或设计器识别会失败。 |
native_class = "android.widget.Button" | 指向 Android 原生 Button。 | 窗口成员生成的原生 View 类型可能不匹配。 |
category = "uni-ui 组件" | 设计器左侧分类。 | 组件可能出现在别的分类或难以找到。 |
# @ public @sn<current_class> ... | 嵌入 Java 构造函数,让生成的类能接收 Android Context 和 Button。 | 本项目曾出现“找不到接收两个参数的构造方法”编译错误。 |
方法 设置主要样式 | 让案例只传标题就得到蓝色按钮。 | 每个页面都得重复写颜色、字号和内边距。 |
@sn<current_class> 是火山生成目标类名时使用的符号;它属于封装层写法。普通使用者只需调用 示例按钮.设置主要样式 ("立即体验"),不用每次自己写 Java 构造函数。六、完整按钮源码
下面直接展示当前文件的实际内容。复制进新项目之前,先确认你的项目确实是火山安卓项目,并使用对应版本的安卓基础类库。这个类保留火山内置按钮能力,新增五种颜色方案;尚未实现 uni-app 按钮的所有属性和状态。
<火山程序 类型 = "通常" 版本 = 1 />
包 火山Uni.界面
类 统一按钮 <公开 基础类 = 按钮 注释 = "火山安卓 uni 风格按钮;继承安卓原生按钮,保留原有点击事件" @安卓.窗口组件.布局配置 = "native_class = \"android.widget.Button\"\ncategory = \"uni-ui 组件\"">
{
# @ public @sn<current_class> (android.content.Context context, Button view) { super (context, view); }
方法 设置主要样式 <公开 注释 = "蓝色主要按钮">
参数 标题 <类型 = 文本型>
{
本对象.内容 = 标题
本对象.背景色 = 0xFF007AFF
本对象.文本颜色 = 0xFFFFFFFF
本对象.文本字体尺寸 = 16
本对象.置内边距 (16, 12, 16, 12)
}
方法 设置次要样式 <公开 注释 = "浅灰色次要按钮">
参数 标题 <类型 = 文本型>
{
本对象.内容 = 标题
本对象.背景色 = 0xFFF1F3F5
本对象.文本颜色 = 0xFF333333
本对象.文本字体尺寸 = 16
本对象.置内边距 (16, 12, 16, 12)
}
方法 设置成功样式 <公开 注释 = "绿色成功按钮">
参数 标题 <类型 = 文本型>
{
本对象.内容 = 标题
本对象.背景色 = 0xFF18BC37
本对象.文本颜色 = 0xFFFFFFFF
本对象.文本字体尺寸 = 16
本对象.置内边距 (16, 12, 16, 12)
}
方法 设置警告样式 <公开 注释 = "橙色警告按钮">
参数 标题 <类型 = 文本型>
{
本对象.内容 = 标题
本对象.背景色 = 0xFFFFA500
本对象.文本颜色 = 0xFFFFFFFF
本对象.文本字体尺寸 = 16
本对象.置内边距 (16, 12, 16, 12)
}
方法 设置危险样式 <公开 注释 = "红色危险按钮">
参数 标题 <类型 = 文本型>
{
本对象.内容 = 标题
本对象.背景色 = 0xFFE43D33
本对象.文本颜色 = 0xFFFFFFFF
本对象.文本字体尺寸 = 16
本对象.置内边距 (16, 12, 16, 12)
}
}
五种方法怎么调用
| 方法 | 传入参数 | 可见效果 |
|---|---|---|
设置主要样式 | 标题:文本,如“立即体验” | 蓝底白字 |
设置次要样式 | 标题:文本,如“稍后再说” | 浅灰底深色字 |
设置成功样式 | 标题:文本,如“保存成功” | 绿底白字 |
设置警告样式 | 标题:文本,如“继续操作” | 橙底白字 |
设置危险样式 | 标题:文本,如“删除记录” | 红底白字 |
文本型 标题,不返回值。它们设置的是当前按钮的内容和外观;点击后要执行业务动作,仍需给按钮绑定点击事件。七、把组件加入自己的安卓工程
- 先复制源码到自己的项目目录。
可从交付目录的
安卓组件库\uni_button.wsv复制。建议放到自己项目的src下,名字保持不变。不要直接改交付库的唯一原件;先留好一份备份。 - 在火山 IDE 中加入现有文件。
在左侧项目名称上右键,选择“添加”里的现有文件入口,选刚复制的
uni_button.wsv。不同版本菜单文字可能略有差异。成功后,项目树中要能看到它。 - 检查类名冲突。
整个项目中只留一份名为
统一按钮的类。同名类若同时来自多个源文件,编译器可能报重复定义。包名也要按项目实际情况组织。 - 保存并重新打开布局设计器。
设计器通常在启动时扫描当前项目的组件类。外部复制文件之后,必要时先关闭再重新打开源文件或设计器。
uni_button.wsv 放在桌面某个文件夹,却没有加入当前工程的项目树。这样在案例里写 类型 = 统一按钮 时仍可能提示找不到类。八、在 main.wsv 中最简单地调用
下面只保留和按钮有关的代码,方便第一次学习。当前案例的完整 main.wsv 还有工作台、订单等演示内容。
<火山程序 类型 = "通常" 版本 = 1 />
包 com.example.tablecase
类 启动类 <公开 基础类 = 窗口>
{
变量 示例按钮 <类型 = 统一按钮 隐藏值属性 = "0"
@安卓.窗口.布局 = "ctrl_order = 2\np_layout_height_type = wrap_content\np_layout_width_type = match_parent">
方法 通知_被创建 <公开 @虚拟方法 = 可覆盖>
参数 启动信息对象 <类型 = 启动信息类>
参数 载入参数 <类型 = "对象类 []">
参数 参数数目 <类型 = 整数>
{
父对象.通知_被创建 (启动信息对象, 载入参数, 参数数目)
示例按钮.设置主要样式 ("立即体验")
}
}| 要替换的地方 | 当前示例 | 你的项目怎么填 |
|---|---|---|
| 包名 | com.example.tablecase | 换成你自己安卓项目实际使用的包名;不要覆盖已有应用的包名。 |
| 变量名 | 示例按钮 | 可改为“登录按钮”“保存按钮”等,声明和调用要一致。 |
| 按钮标题 | "立即体验" | 改为用户实际会看到的文字,如“登录”。 |
| 样式方法 | 设置主要样式 | 需要其他颜色时改成上表中的公开方法。 |
执行时机:通知_被创建 是窗口创建后的初始化方法。先调用 父对象.通知_被创建,再设置按钮文字和样式。调用没有返回参数;成功与否通过编译和运行结果判断。
main.wsv 覆盖掉,否则原来的窗口配置和业务代码可能丢失。九、怎样让组件出现在左侧拖拽列表
- 确认源码已加入当前安卓项目。
设计器读取的是项目已识别的窗口组件类,不会自动扫描桌面上所有文件。
- 打开窗口布局。
在
main.wsv的窗口类处右键,选“设计启动类的界面布局”。若你用的是别的窗口类,菜单名称会随类名变化。 - 在左侧找“uni-ui 组件”。
按钮源码中写了
category = "uni-ui 组件"。远程测试已能在这个分类看到统一按钮。 - 尝试拖入窗口并命名。
把组件拖入预览区,在属性中设置名称、宽高和边距。保存后检查窗口类是否出现类型为
统一按钮的成员变量。 - 最后一定完整编译并运行。
“列表里看得到”只说明分类识别,不能代替拖入保存、Java 编译和安卓运行。当前已验证的是设计器分类可见与案例变量运行;直接拖入后保存的完整流程仍需单独记录。
十、从源码到 APK:按顺序验证
- 先保存所有源文件。
火山 IDE 若提示“文件已在外部修改,是否重新载入”,选重新载入,确保编译的是最新文件。避免只修改了桌面库副本,案例工程仍引用旧版。
- 做完整构建。
在“生成”菜单选择“生成活动项目”。只做“生成对应项目目标代码”不能证明 Java 编译和 APK 打包成功。
- 看底部输出。
成功应出现生成的 APK 路径和“编译并链接成功”。如果只看到代码生成成功,但 Java 构造方法报错,仍算失败。
- 配置签名。
安卓 APK 需要正确的签名配置。官方新手教程有“建立密钥文件”“编译发布版本”的步骤。测试可以用独立测试签名;正式发布应使用你自己妥善保管的签名密钥,不要把测试密钥当正式密钥。
- 安装到 MuMu 并启动。
本项目在独立测试副本 C:\unidemo 中修改成独立包名
com.example.unibuttontest,避免覆盖模拟器内已有同包名应用。APK 安装成功后,使用 ADB 启动,实际看到了“立即体验”按钮;点击后页面继续运行。
"D:\Program Files\Netease\MuMu\nx_main\adb.exe" devices -l
"D:\Program Files\Netease\MuMu\nx_main\adb.exe" install -r "C:\unidemo\_int\uninativedemo\release\linker\uninativedemo.apk"
"D:\Program Files\Netease\MuMu\nx_main\adb.exe" shell monkey -p com.example.unibuttontest -c android.intent.category.LAUNCHER 1
"D:\Program Files\Netease\MuMu\nx_main\adb.exe" shell pidof com.example.unibuttontest这组命令解释的是本次测试流程;普通使用者也可以通过火山 IDE 的调试入口启动。devices -l 应看到 device;install 返回 Success;pidof 返回进程编号表示应用仍在运行。
十一、按钮以外:怎样封装“容器组件”
按钮是单个原生控件;卡片、列表、表格通常由多个子控件组成,需要一个能添加子控件的容器。现有初版采用 基础类 = 自定义窗口容器组件。下面是从本项目卡片源码提炼的核心结构:
类 卡片组件 <公开 基础类 = 自定义窗口容器组件
@安卓.窗口组件.布局配置 = "native_class = \"@安卓自定义窗口容器组件\"\ncategory = \"uni-ui 组件\"">
{
方法 设置内容 <公开>
参数 标题 <类型 = 文本型>
参数 正文 <类型 = 文本型>
参数 提示 <类型 = 文本型>
{
变量 标题框 <类型 = 文本框 参考>
本对象.布局器.删除所有子组件 ()
标题框 = 本对象.取安卓窗口容器组件 ().创建窗口组件 (文本框, 空对象)
标题框.内容 = 标题
本对象.布局器.添加子组件 (标题框, 空对象)
# 同样方式创建正文框、提示框并加入布局器
}
}| 步骤 | 作用 | 需要注意 |
|---|---|---|
| 继承容器基础类 | 使组件可以承载多个子组件。 | 原生映射要与容器类一致。 |
| 删除旧子组件 | 重新设置内容时先清空旧内容。 | 否则反复调用会累加重复项目。 |
| 创建文本框 | 根据输入参数动态生成标题等元素。 | “参考”变量要保留合适的使用范围。 |
| 设置内容与样式 | 决定每个子元素显示什么。 | 文字、颜色、字号最好封装成配置,而非写死。 |
| 加入布局器 | 让子元素真正出现在界面上。 | 只创建对象不添加,屏幕上不会显示。 |
十二、表格要特别注意:外观与数据结构不能混为一谈
当前演示页的“最近订单”把一整行文字放进一个文本框,例如订单号、客户、状态被空格和换行拼在一起。这能做视觉演示,不是真正的三列表格。独立 表格组件.wsv 有“清空、设置表头、添加行”的初版方法,但它的 添加行 仍以整段文本创建一个文本框。
真正的表格应该怎样设计
- 先定义列:例如“订单号、客户、状态”,每列有字段名、宽度、显示类型。
- 每条数据行创建一个横向容器;每列在这个容器中创建独立单元格。
- 状态列若要下拉,创建真正的选择控件,不能只显示“待处理”三个字。
- 每行绑定稳定的业务 ID,例如
A1002;改变下拉值时保存 ID 和新状态。 - 重新渲染时从数据恢复选中值;输入错误行号或列号时返回中文错误。
- 窄屏和大字体下检查对齐、横向滚动与可访问性。
火山安卓表格组件封装教程.html。该页有交互示意,但网页交互不代表火山表格已经实现这些能力。十三、现有组件有哪些公开命令
下表只列当前独立源码文件里能看到的公开方法。按钮已完成基础运行验证;其余仍为待验收初版。参数顺序按源文件实际声明填写。
| 组件类 | 公开方法 | 传入参数 | 作用与当前限制 |
|---|---|---|---|
| 统一按钮 | 设置主要样式、设置次要样式、设置成功样式、设置警告样式、设置危险样式 | 标题:文本型 | 设置按钮文字与五种预设外观;已验证主要样式运行。 |
| 卡片组件 | 设置内容 | 标题、正文、提示:均为文本型 | 创建三段内容;初版未验收。 |
| 列表组件 | 清空;添加项目 | 添加项目:标题、说明,均为文本型 | 清空列表或追加标题与说明;初版未验收。 |
| 表格组件 | 清空;设置表头;添加行 | 设置表头:文字;添加行:文字、状态 | 状态可填“普通、斑马、强调、错误”;当前仍是整行文本。 |
| 其他独立组件 | 见对应 .wsv 源码 | 以源文件声明为准 | 尚未逐项完成构建与运行测试。 |
组件变量.方法 (实际参数),例如 示例按钮.设置主要样式 ("登录")。包名用于组织源码;实际代码中不需要把长包名重复写在每次方法调用前。十四、常见错误及修复
1. “找不到统一按钮类”
先看 uni_button.wsv 是否出现在当前项目树里;再查类名是否仍为 统一按钮。只在磁盘放了源码、不加入工程,是最常见原因。
2. 设计器左侧没有出现组件
确认继承了安卓窗口组件基础类,布局配置写对,并关闭后重新打开设计器。查看设计器底部提示是否有加载错误。分类可见不等于已经能拖入保存。
3. Java 编译提示构造方法参数不匹配
本项目实际碰到过:窗口声明自定义按钮后,生成代码会把 Context 和原生 Button 传给自定义类。按钮源码通过嵌入接收这两个参数的 Java 构造函数修复。若你改了基础类,参数类型也必须跟新基础类一致。
4. 宏 DEFINE_CONTROL2 提示参数数量不对
不能把该宏当成无参数命令直接写。当前已验证的按钮采用显式嵌入构造函数。不要把失败的宏写法复制到正式源码。
5. 生成代码成功,但 APK 仍失败
检查 Java 编译、签名配置和链接输出。完整构建要看到 APK 路径与“编译并链接成功”,仅代码生成成功不算通过。
6. 安装时提示 INSTALL_FAILED_UPDATE_INCOMPATIBLE
通常是设备里已有相同包名、不同签名的应用。不要直接卸载可能含用户数据的旧应用。测试时改用独立包名;本项目测试用 com.example.unibuttontest。
7. ADB 显示 offline 或 no devices
确认 MuMu 的 Android 实例已经完全启动,再运行 adb devices -l。有时 ADB 服务刚启动时会短暂显示 offline,稍后重试。需要看到 device 才继续安装和启动。
8. 桌面图标点了又回到首页
先查看应用是否仍在运行,再用 ADB 或 IDE 启动并查看日志。当前测试包通过 ADB 启动后正常显示;初次图标启动时曾出现权限选择页,不能只凭一次回到桌面就判断源码崩溃。
9. 同名卡片或表格类重复定义
案例的聚合文件 uni_components.wsv 中也可能定义“卡片组件”等类。要同时使用独立文件时,先整理工程引用,保证一个项目里同一类只有一个定义;不要直接删除原始源码。
10. 表格显示成一行文字
这是当前演示的真实限制。要实现独立单元格和下拉字段,必须改造组件的数据模型和布局,不能只靠增加空格对齐。
十五、一个组件怎样才算“真的封装完成”
做完整组件库,不应只用“有类名”作为完成标准。以下清单每一项都要有证据:
- 独立源文件存在,类名、包名和公开方法清楚。
- 加入一个全新安卓工程后,项目树能识别它。
- 设计器左侧能找到,实际拖入并保存后能生成窗口变量。
- 属性有默认值、边界值和错误处理;多次更新内容不会重复堆叠。
- 事件能绑定并拿到正确参数,点击或选择后能执行实际动作。
- 完整构建通过:火山代码生成、Java 编译、签名和 APK 链接。
- 安卓模拟器或真机可显示、可交互,关闭与重新进入后状态正确。
- 有完整调用案例,传入什么、返回什么、出错如何处理都写明白。
- 对照 uni-app 官方文档,逐条记录已支持、未支持和 Android 特有限制。
当前按钮达到“基础可构建、可显示、可点击后继续运行”,尚未达到上面全部验收项。官方组件对齐进度以 UniApp组件对齐清单.md 为准。
十六、新手最常问的几个问题
我是不是只要一个 DLL 就能在左侧拖拽?
不是。本按钮示例靠火山安卓窗口组件类、布局配置和项目引用进入设计器;没有单独 DLL。DLL 可以承担底层运行能力,但不会自动替你生成设计器里的可拖组件。
可以只写 main.wsv,不单独建组件库吗?
可以把代码写在同一文件里,但不利于复用,也容易让案例变得复杂。现在采用“独立组件文件 + 案例调用”的结构:组件库封装能力,main.wsv 只放窗口和使用方式。
为什么按钮用继承,卡片用容器?
按钮本来就是一个原生可点击控件,继承最直接;卡片要放标题、正文等多个子控件,因此用容器承载它们。基础类要按组件实际结构选择。
包名和调用方法的名字是不是一回事?
不是。包 火山Uni.界面 用来组织源码;类 统一按钮 是组件类型;示例按钮 是窗口里的变量;设置主要样式 是对变量调用的方法。
这个是不是已经一比一实现 uni-app?
还没有。当前目标范围为官方内置组件加官方 uni-ui,共 83 项;现阶段只有按钮的基础样式完成了较完整的编译与运行验证。其它项目需要继续逐项开发和验收。
十七、第一次动手:照着做一遍按钮案例
这一节按“你正在远程 Windows 桌面前操作”来写。每做完一步先核对结果,再做下一步;失败时从对应步骤返回,不要跳到编译末尾猜原因。
- 找到交付目录。
在 Windows 文件资源管理器打开桌面,进入 火山安卓项目交付。应同时看到
安卓组件库、案例和本教程。若只看到 APK 而找不到源码,说明当前打开的不是交付目录。完成标志:
安卓组件库\uni_button.wsv和案例\uninativedemo.vsln都存在。 - 打开解决方案,不要只双击源码。
双击
案例\uninativedemo.vsln。火山 IDE 左侧出现解决方案树,展开项目后能看到main.wsv与uni_button.wsv。只双击一个孤立的.wsv文件可能看得到代码,却没有正确的项目模块与编译配置。完成标志:标题栏显示工程名,左侧存在“Java基本类”“安卓基本类”模块。
- 先打开按钮源码核对类名。
双击项目树里的
uni_button.wsv。上方应有包 火山Uni.界面,类名应为统一按钮,公开方法包括设置主要样式。若看不到这些内容,可能打开了旧副本。完成标志:编辑器中可以看到五种样式方法和构造函数嵌入行。
- 再看案例窗口怎么调用。
双击
main.wsv,找到变量示例按钮和窗口创建方法中的示例按钮.设置主要样式 ("立即体验")。前者是“放了一个按钮”,后者是“给这个按钮设置外观”。二者的变量名必须相同。完成标志:变量声明的类型为
统一按钮,调用目标也是同一个示例按钮。 - 看设计器分类。
在窗口类位置右键打开界面布局设计器。查看左侧
uni-ui 组件分类,确认有统一按钮。本步骤只核对分类识别;若你自己拖入新按钮,还应保存布局并检查生成的窗口变量,不能只看预览图。完成标志:左侧分类中能看到组件名称。
- 执行完整构建。
返回代码界面,保存文件,从“生成”菜单选“生成活动项目”。等待底部输出结束。成功时输出里有 APK 路径和“编译并链接成功”;如果只出现“目标代码生成成功”,还需要继续确认 Java 编译和打包。
完成标志:完整构建成功,无错误,APK 文件确实生成。
- 启动 MuMu 看实际画面。
先让模拟器启动到安卓桌面,再安装测试 APK。当前交付目录的
案例\uni_button_测试.apk是独立包名的测试产物。打开后应在“工作台”标题下看到蓝色“立即体验”按钮。点一下按钮,页面应继续显示。完成标志:蓝色按钮真实显示在安卓界面上,点击后没有退出。
com.example.unibuttontest 后构建的。这样是为了不覆盖模拟器中已有的同名应用。比较代码时不要误以为两个包名必须相同。十八、把按钮方法再拆开:每一行改变了什么
初学时只看“蓝色按钮”会不知道颜色从哪里来。下面以 设置主要样式 为例,按执行顺序解释实际源码。
方法 设置主要样式 <公开 注释 = "蓝色主要按钮">
参数 标题 <类型 = 文本型>
{
本对象.内容 = 标题
本对象.背景色 = 0xFF007AFF
本对象.文本颜色 = 0xFFFFFFFF
本对象.文本字体尺寸 = 16
本对象.置内边距 (16, 12, 16, 12)
}| 代码 | 你传什么或它改变什么 | 本例实际值 |
|---|---|---|
方法 设置主要样式 <公开> | 定义外部可调用的方法。没有额外返回值。 | 调用写法:示例按钮.设置主要样式 ("立即体验") |
参数 标题 <类型 = 文本型> | 调用者必须传入一段文字。 | 传入 "立即体验";改登录页可传 "登录"。 |
本对象.内容 = 标题 | 把传来的文字放到当前按钮上。 | 按钮表面显示“立即体验”。 |
本对象.背景色 = 0xFF007AFF | 设置按钮背景色。颜色值按 ARGB 十六进制写。 | FF 表示不透明,后面 007AFF 是蓝色。 |
本对象.文本颜色 = 0xFFFFFFFF | 设置字的颜色。 | 不透明白色。 |
本对象.文本字体尺寸 = 16 | 设置文字尺寸。 | 值为 16;实际设备视觉大小仍需运行检查。 |
本对象.置内边距 (16, 12, 16, 12) | 给文字周围留空白,让按钮不贴边。 | 左、上、右、下分别传入 16、12、16、12。 |
想改成自己的按钮,最少改哪三处?
- 把调用参数
"立即体验"改成实际标题,例如"提交订单"。 - 需要另一种预设颜色时,换调用的方法名,例如
设置危险样式;不要在每个页面重复写颜色。 - 需要新的品牌颜色时,在组件库新增一个公开样式方法,再从窗口调用;不要直接改坏已经通过验证的五个方法。
十九、发生错误时,按哪一层排查
从最靠近错误的一层查起。这样可以避免“设计器列表看不到,就去改安卓签名”之类的无效操作。
| 观察到的现象 | 先检查 | 随后检查 | 成功证据 |
|---|---|---|---|
项目树没有 uni_button.wsv | 文件是否真的在项目 src 里 | 是否通过 IDE 加入当前工程 | 项目树出现该文件 |
| 类名显示红色或提示不存在 | 类名是否为 统一按钮 | 安卓基本类模块、同名类冲突 | 变量类型可被识别 |
| 设计器里找不到组件 | 类是否继承安卓窗口组件 | 布局配置、设计器状态提示 | 左侧分类出现“统一按钮” |
| 火山代码生成报错 | 源文件语法和宏参数 | 错误行所用方法/属性是否存在 | 生成目标 Java 代码成功 |
| Java 编译报构造方法错误 | 自定义类的嵌入构造函数 | Context、Button 类型是否与生成代码匹配 | Java 编译继续进入 APK 链接 |
| APK 链接或签名失败 | 项目签名文件配置 | 密钥是否存在、路径是否正确 | 输出 APK 文件并提示成功 |
| 安装失败 | 模拟器是否已启动、ADB 是否显示 device | 包名和签名是否与已安装应用冲突 | 安装返回 Success |
| 页面打开但按钮不显示 | 窗口变量是否存在 | 布局顺序、尺寸、样式方法是否执行 | 屏幕上能看到按钮文字与蓝色背景 |
什么时候需要保存“错误原文”?
看到任何编译失败时,把底部输出中的源文件路径、行号、错误内容一起保存。只说“编译失败”无法判断是火山语法、Java 构造、签名,还是模拟器连接问题。改动后重新构建,并确认旧错误确实消失。
Context 与 Button 的构造函数,才真正生成 APK。因此请始终做“完整构建”。二十、学会按钮后,怎样独立封装下一个组件
新组件按固定流程推进,别一次复制几十个同名空壳。下面以“列表组件”为例,说明工作顺序;这是开发步骤,不代表它已经通过验收。
- 先明确用途和最小调用。
例如
列表.添加项目 ("订单 A1001", "张三 · 已完成")。先写明调用者传两个文本参数,方法把一条项目加到列表末尾;列表.清空 ()则删除全部项目。把这两个行为写清楚,再动源码。 - 确定组件结构。
每项要有标题和说明两个独立子控件。列表本身需容纳多项,因此继承容器组件比继承单个文本框更合适。
- 写一个独立 `.wsv`。
定义公开类、布局配置与最少的公开方法。检查包名和类名不与案例里的
uni_components.wsv重复。若已有同名聚合类,先整理工程引用。 - 只把这个组件加入案例。
在
main.wsv声明一个该类型的变量,调用添加项目两次、清空一次,再添加一次。预期应只有最后一项;这样能测出追加和清空是否正确。 - 逐层验收。
先设计器识别,再完整编译 APK,然后在 MuMu 中核对显示、点击、重复添加、清空后重建。每一步记录结果。
- 最后写文档。
把公开方法、参数类型、调用示例、返回值、错误行为、当前限制写到教程和对齐清单里。没有运行证据就标“未验收”。
二十一、建议怎样保存验收记录
每个组件维护一张简单记录表。这样以后换一台 Windows 电脑或换一个火山版本,也能快速知道什么被验证过。
| 记录字段 | 按钮当前示例 | 你做新组件时填写 |
|---|---|---|
| 组件名称 | 统一按钮 | 例如“列表组件” |
| 源码文件 | 安卓组件库/uni_button.wsv | 独立组件源文件路径 |
| 最小调用 | 示例按钮.设置主要样式 ("立即体验") | 能验证组件的最少代码 |
| 设计器 | 分类“uni-ui 组件”中可见;拖拽保存仍需单独验收 | 分类可见、拖入、保存分别记录 |
| 完整编译 | 远程火山 IDE 生成 APK,0 个警告 | 日期、IDE 版本、错误数量、APK 路径 |
| 运行设备 | MuMu Android 模拟器 | 模拟器或真机型号与 Android 版本 |
| 运行结果 | 蓝色按钮可见,点击后应用仍在运行 | 截图或具体操作过程 |
| 尚缺能力 | 完整 uni-app 按钮属性、状态、事件 | 明确列出未实现项目 |
记录时请把“看得到”“能拖入”“能保存”“能编译”“能运行”分成不同列。它们互相不能替代。正式发布前还应验证签名、包名、安装升级和目标安卓版本。
二十二、参考资料和文件入口
- 火山官方:安卓新手入门,包括新建项目、模拟器调试、包名、密钥和编译发布。
- 火山官方:封装语法手册,用于理解包、类、继承、嵌入目标语言代码等封装层语法。
- uni-app 官方组件目录,用来逐项核对目标组件能力。
- uni-ui 官方说明,用来核对扩展组件范围。
- 本机工作区:/Users/songguoqing/Downloads/Bug/火山/安卓组件库/uni_button.wsv、安卓表格案例/main.wsv、UniApp组件对齐清单.md。
本页是离线 HTML,双击即可在浏览器打开;源码示例仅展示,不会在网页里编译或运行火山代码。复制按钮只复制可见代码。