火山安卓 · 组件封装实战

从零封装一个能在火山里调用的安卓组件

用已在远程火山 IDE 编译、在 MuMu 模拟器运行的“统一按钮”做完整示范;再说明卡片、列表、表格怎样扩展。每一步都写清楚文件放哪里、代码做什么、如何判断成功。

适合零基础火山安卓项目独立组件源码 + 案例工程更新:2026-11-06

一、先看目标与现状

本教程讲的是火山安卓的界面组件封装,不是 Windows 视窗或 MFC 控件。目标是把常用界面能力整理成独立组件,让普通使用者只需在窗口中声明变量并调用中文方法。

写 .wsv 组件类→加入安卓工程→设计器识别→main.wsv 调用→构建 APK→模拟器运行
1 个按钮组件已完成基础构建与运行验证
7 个独立容器组件有初版源码,未逐项验收
83 项官方组件对齐目标,尚未全部实现
请先看清范围:现在可以证明“统一按钮”的基础样式可在安卓案例中显示并点击后继续运行;还不能声称 uni-app 的所有按钮属性、事件或全部 83 个组件已经一比一完成。卡片、表格等初版也不能直接视为正式交付。

二、五个基本概念

名称通俗解释在本项目中
组件类一个可重复使用的界面“零件”,里面写外观和方法。类 统一按钮
基础类新零件继承谁的能力。继承按钮就保留按钮的原生行为。基础类 = 按钮
公开方法外部代码能调用的命令。设置主要样式 ("立即体验")
窗口变量窗口里实际放置的一个组件实例,类似给零件取名字。示例按钮
设计器分类左侧拖拽工具箱里的分组名称。uni-ui 组件

关键区别:写好一个 `.wsv` 文件,只代表有源码。加入项目、设计器能找到、完整编译、安卓上实际运行,是四次独立检查。

三、准备软件与工程

  1. 打开火山安卓开发环境。

    在 Windows 上启动火山开发平台。官方新手教程的建项目路径为“文件 → 新建 → 项目”,选择“空白安卓程序”和“空窗口”。已有工程可直接打开桌面交付目录里的解决方案文件。

  2. 打开当前案例。

    远程桌面交付目录:C:\Users\Administrator\Desktop\火山安卓项目交付。打开案例\uninativedemo.vsln。左侧项目树应看到 main.wsv、uni_button.wsv 等文件。

  3. 确认基础模块。

    项目树的“模块”下应有“Java基本类”和“安卓基本类”。没有这两个模块,安卓控件名称可能无法识别。

  4. 准备模拟器。

    远程电脑已安装 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 按钮的所有属性和状态。

安卓组件库/uni_button.wsv
<火山程序 类型 = "通常" 版本 = 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)
    }
}

五种方法怎么调用

方法传入参数可见效果
设置主要样式标题:文本,如“立即体验”蓝底白字
设置次要样式标题:文本,如“稍后再说”浅灰底深色字
设置成功样式标题:文本,如“保存成功”绿底白字
设置警告样式标题:文本,如“继续操作”橙底白字
设置危险样式标题:文本,如“删除记录”红底白字
五个方法都只接收一个 文本型 标题,不返回值。它们设置的是当前按钮的内容和外观;点击后要执行业务动作,仍需给按钮绑定点击事件。

七、把组件加入自己的安卓工程

  1. 先复制源码到自己的项目目录。

    可从交付目录的 安卓组件库\uni_button.wsv 复制。建议放到自己项目的 src 下,名字保持不变。不要直接改交付库的唯一原件;先留好一份备份。

  2. 在火山 IDE 中加入现有文件。

    在左侧项目名称上右键,选择“添加”里的现有文件入口,选刚复制的 uni_button.wsv。不同版本菜单文字可能略有差异。成功后,项目树中要能看到它。

  3. 检查类名冲突。

    整个项目中只留一份名为 统一按钮 的类。同名类若同时来自多个源文件,编译器可能报重复定义。包名也要按项目实际情况组织。

  4. 保存并重新打开布局设计器。

    设计器通常在启动时扫描当前项目的组件类。外部复制文件之后,必要时先关闭再重新打开源文件或设计器。

不要这样做:只把 uni_button.wsv 放在桌面某个文件夹,却没有加入当前工程的项目树。这样在案例里写 类型 = 统一按钮 时仍可能提示找不到类。

八、在 main.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换成你自己安卓项目实际使用的包名;不要覆盖已有应用的包名。
变量名示例按钮可改为“登录按钮”“保存按钮”等,声明和调用要一致。
按钮标题"立即体验"改为用户实际会看到的文字,如“登录”。
样式方法设置主要样式需要其他颜色时改成上表中的公开方法。

执行时机:通知_被创建 是窗口创建后的初始化方法。先调用 父对象.通知_被创建,再设置按钮文字和样式。调用没有返回参数;成功与否通过编译和运行结果判断。

这个精简代码展示的是“怎样调用”。创建新项目时,请在 IDE 的现有窗口类中添加变量和调用,不要机械地把整个 main.wsv 覆盖掉,否则原来的窗口配置和业务代码可能丢失。

九、怎样让组件出现在左侧拖拽列表

  1. 确认源码已加入当前安卓项目。

    设计器读取的是项目已识别的窗口组件类,不会自动扫描桌面上所有文件。

  2. 打开窗口布局。

    在 main.wsv 的窗口类处右键,选“设计启动类的界面布局”。若你用的是别的窗口类,菜单名称会随类名变化。

  3. 在左侧找“uni-ui 组件”。

    按钮源码中写了 category = "uni-ui 组件"。远程测试已能在这个分类看到 统一按钮。

  4. 尝试拖入窗口并命名。

    把组件拖入预览区,在属性中设置名称、宽高和边距。保存后检查窗口类是否出现类型为 统一按钮 的成员变量。

  5. 最后一定完整编译并运行。

    “列表里看得到”只说明分类识别,不能代替拖入保存、Java 编译和安卓运行。当前已验证的是设计器分类可见与案例变量运行;直接拖入后保存的完整流程仍需单独记录。

按钮已通过的证据:远程火山 IDE 左侧设计器分类能看到“统一按钮”;案例声明该类型并调用设置样式后,完整构建 APK;MuMu 中显示蓝色按钮。

十、从源码到 APK:按顺序验证

  1. 先保存所有源文件。

    火山 IDE 若提示“文件已在外部修改,是否重新载入”,选重新载入,确保编译的是最新文件。避免只修改了桌面库副本,案例工程仍引用旧版。

  2. 做完整构建。

    在“生成”菜单选择“生成活动项目”。只做“生成对应项目目标代码”不能证明 Java 编译和 APK 打包成功。

  3. 看底部输出。

    成功应出现生成的 APK 路径和“编译并链接成功”。如果只看到代码生成成功,但 Java 构造方法报错,仍算失败。

  4. 配置签名。

    安卓 APK 需要正确的签名配置。官方新手教程有“建立密钥文件”“编译发布版本”的步骤。测试可以用独立测试签名;正式发布应使用你自己妥善保管的签名密钥,不要把测试密钥当正式密钥。

  5. 安装到 MuMu 并启动。

    本项目在独立测试副本 C:\unidemo 中修改成独立包名 com.example.unibuttontest,避免覆盖模拟器内已有同包名应用。APK 安装成功后,使用 ADB 启动,实际看到了“立即体验”按钮;点击后页面继续运行。

远程验证用的命令示例(在远程 Windows 的命令提示符运行;路径按实际安装位置替换)
"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 返回进程编号表示应用仍在运行。

十一、按钮以外:怎样封装“容器组件”

按钮是单个原生控件;卡片、列表、表格通常由多个子控件组成,需要一个能添加子控件的容器。现有初版采用 基础类 = 自定义窗口容器组件。下面是从本项目卡片源码提炼的核心结构:

卡片组件.wsv 的核心写法
类 卡片组件 <公开 基础类 = 自定义窗口容器组件
    @安卓.窗口组件.布局配置 = "native_class = \"@安卓自定义窗口容器组件\"\ncategory = \"uni-ui 组件\"">
{
    方法 设置内容 <公开>
    参数 标题 <类型 = 文本型>
    参数 正文 <类型 = 文本型>
    参数 提示 <类型 = 文本型>
    {
        变量 标题框 <类型 = 文本框 参考>
        本对象.布局器.删除所有子组件 ()
        标题框 = 本对象.取安卓窗口容器组件 ().创建窗口组件 (文本框, 空对象)
        标题框.内容 = 标题
        本对象.布局器.添加子组件 (标题框, 空对象)
        # 同样方式创建正文框、提示框并加入布局器
    }
}
步骤作用需要注意
继承容器基础类使组件可以承载多个子组件。原生映射要与容器类一致。
删除旧子组件重新设置内容时先清空旧内容。否则反复调用会累加重复项目。
创建文本框根据输入参数动态生成标题等元素。“参考”变量要保留合适的使用范围。
设置内容与样式决定每个子元素显示什么。文字、颜色、字号最好封装成配置,而非写死。
加入布局器让子元素真正出现在界面上。只创建对象不添加,屏幕上不会显示。
这里解释的是当前初版源码的思路。独立卡片、列表、表格等组件尚未像按钮一样完成逐项构造方法、拖拽保存、APK 构建和安卓运行验收。学习时可以参考结构,正式项目应先完成这些验证。

十二、表格要特别注意:外观与数据结构不能混为一谈

当前演示页的“最近订单”把一整行文字放进一个文本框,例如订单号、客户、状态被空格和换行拼在一起。这能做视觉演示,不是真正的三列表格。独立 表格组件.wsv 有“清空、设置表头、添加行”的初版方法,但它的 添加行 仍以整段文本创建一个文本框。

真正的表格应该怎样设计

  1. 先定义列:例如“订单号、客户、状态”,每列有字段名、宽度、显示类型。
  2. 每条数据行创建一个横向容器;每列在这个容器中创建独立单元格。
  3. 状态列若要下拉,创建真正的选择控件,不能只显示“待处理”三个字。
  4. 每行绑定稳定的业务 ID,例如 A1002;改变下拉值时保存 ID 和新状态。
  5. 重新渲染时从数据恢复选中值;输入错误行号或列号时返回中文错误。
  6. 窄屏和大字体下检查对齐、横向滚动与可访问性。
完整的行列与下拉字段学习可看同目录的 火山安卓表格组件封装教程.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 桌面前操作”来写。每做完一步先核对结果,再做下一步;失败时从对应步骤返回,不要跳到编译末尾猜原因。

  1. 找到交付目录。

    在 Windows 文件资源管理器打开桌面,进入 火山安卓项目交付。应同时看到 安卓组件库、案例 和本教程。若只看到 APK 而找不到源码,说明当前打开的不是交付目录。

    完成标志:安卓组件库\uni_button.wsv 和 案例\uninativedemo.vsln 都存在。

  2. 打开解决方案,不要只双击源码。

    双击 案例\uninativedemo.vsln。火山 IDE 左侧出现解决方案树,展开项目后能看到 main.wsv 与 uni_button.wsv。只双击一个孤立的 .wsv 文件可能看得到代码,却没有正确的项目模块与编译配置。

    完成标志:标题栏显示工程名,左侧存在“Java基本类”“安卓基本类”模块。

  3. 先打开按钮源码核对类名。

    双击项目树里的 uni_button.wsv。上方应有 包 火山Uni.界面,类名应为 统一按钮,公开方法包括 设置主要样式。若看不到这些内容,可能打开了旧副本。

    完成标志:编辑器中可以看到五种样式方法和构造函数嵌入行。

  4. 再看案例窗口怎么调用。

    双击 main.wsv,找到变量 示例按钮 和窗口创建方法中的 示例按钮.设置主要样式 ("立即体验")。前者是“放了一个按钮”,后者是“给这个按钮设置外观”。二者的变量名必须相同。

    完成标志:变量声明的类型为 统一按钮,调用目标也是同一个 示例按钮。

  5. 看设计器分类。

    在窗口类位置右键打开界面布局设计器。查看左侧 uni-ui 组件 分类,确认有 统一按钮。本步骤只核对分类识别;若你自己拖入新按钮,还应保存布局并检查生成的窗口变量,不能只看预览图。

    完成标志:左侧分类中能看到组件名称。

  6. 执行完整构建。

    返回代码界面,保存文件,从“生成”菜单选“生成活动项目”。等待底部输出结束。成功时输出里有 APK 路径和“编译并链接成功”;如果只出现“目标代码生成成功”,还需要继续确认 Java 编译和打包。

    完成标志:完整构建成功,无错误,APK 文件确实生成。

  7. 启动 MuMu 看实际画面。

    先让模拟器启动到安卓桌面,再安装测试 APK。当前交付目录的 案例\uni_button_测试.apk 是独立包名的测试产物。打开后应在“工作台”标题下看到蓝色“立即体验”按钮。点一下按钮,页面应继续显示。

    完成标志:蓝色按钮真实显示在安卓界面上,点击后没有退出。

关于交付案例与测试包:交付案例的源码包名保留原配置;测试 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。

想改成自己的按钮,最少改哪三处?

  1. 把调用参数 "立即体验" 改成实际标题,例如 "提交订单"。
  2. 需要另一种预设颜色时,换调用的方法名,例如 设置危险样式;不要在每个页面重复写颜色。
  3. 需要新的品牌颜色时,在组件库新增一个公开样式方法,再从窗口调用;不要直接改坏已经通过验证的五个方法。
为什么不在这里写“点击后执行什么”?当前五个方法只设置外观。按钮点击事件属于窗口业务逻辑;要确认你的火山版本中按钮点击事件的准确名称与参数,再在 IDE 的事件方法中写动作。不要把“样式设置成功”误当作“点击业务已完成”。

十九、发生错误时,按哪一层排查

从最靠近错误的一层查起。这样可以避免“设计器列表看不到,就去改安卓签名”之类的无效操作。

观察到的现象先检查随后检查成功证据
项目树没有 uni_button.wsv文件是否真的在项目 src 里是否通过 IDE 加入当前工程项目树出现该文件
类名显示红色或提示不存在类名是否为 统一按钮安卓基本类模块、同名类冲突变量类型可被识别
设计器里找不到组件类是否继承安卓窗口组件布局配置、设计器状态提示左侧分类出现“统一按钮”
火山代码生成报错源文件语法和宏参数错误行所用方法/属性是否存在生成目标 Java 代码成功
Java 编译报构造方法错误自定义类的嵌入构造函数Context、Button 类型是否与生成代码匹配Java 编译继续进入 APK 链接
APK 链接或签名失败项目签名文件配置密钥是否存在、路径是否正确输出 APK 文件并提示成功
安装失败模拟器是否已启动、ADB 是否显示 device包名和签名是否与已安装应用冲突安装返回 Success
页面打开但按钮不显示窗口变量是否存在布局顺序、尺寸、样式方法是否执行屏幕上能看到按钮文字与蓝色背景

什么时候需要保存“错误原文”?

看到任何编译失败时,把底部输出中的源文件路径、行号、错误内容一起保存。只说“编译失败”无法判断是火山语法、Java 构造、签名,还是模拟器连接问题。改动后重新构建,并确认旧错误确实消失。

本项目实际踩过的坑:曾经按钮在设计器可见、火山目标代码生成成功,但完整 Java 编译因构造函数缺失失败。后来补上接收 Context 与 Button 的构造函数,才真正生成 APK。因此请始终做“完整构建”。

二十、学会按钮后,怎样独立封装下一个组件

新组件按固定流程推进,别一次复制几十个同名空壳。下面以“列表组件”为例,说明工作顺序;这是开发步骤,不代表它已经通过验收。

  1. 先明确用途和最小调用。

    例如 列表.添加项目 ("订单 A1001", "张三 · 已完成")。先写明调用者传两个文本参数,方法把一条项目加到列表末尾;列表.清空 () 则删除全部项目。把这两个行为写清楚,再动源码。

  2. 确定组件结构。

    每项要有标题和说明两个独立子控件。列表本身需容纳多项,因此继承容器组件比继承单个文本框更合适。

  3. 写一个独立 `.wsv`。

    定义公开类、布局配置与最少的公开方法。检查包名和类名不与案例里的 uni_components.wsv 重复。若已有同名聚合类,先整理工程引用。

  4. 只把这个组件加入案例。

    在 main.wsv 声明一个该类型的变量,调用 添加项目 两次、清空 一次,再添加一次。预期应只有最后一项;这样能测出追加和清空是否正确。

  5. 逐层验收。

    先设计器识别,再完整编译 APK,然后在 MuMu 中核对显示、点击、重复添加、清空后重建。每一步记录结果。

  6. 最后写文档。

    把公开方法、参数类型、调用示例、返回值、错误行为、当前限制写到教程和对齐清单里。没有运行证据就标“未验收”。

如果下一项是表格,测试还必须包含真正独立的单元格和下拉控件;“整行文本框”只能算视觉原型。若下一项是图片,额外检查路径、加载失败、尺寸裁剪和权限。

二十一、建议怎样保存验收记录

每个组件维护一张简单记录表。这样以后换一台 Windows 电脑或换一个火山版本,也能快速知道什么被验证过。

记录字段按钮当前示例你做新组件时填写
组件名称统一按钮例如“列表组件”
源码文件安卓组件库/uni_button.wsv独立组件源文件路径
最小调用示例按钮.设置主要样式 ("立即体验")能验证组件的最少代码
设计器分类“uni-ui 组件”中可见;拖拽保存仍需单独验收分类可见、拖入、保存分别记录
完整编译远程火山 IDE 生成 APK,0 个警告日期、IDE 版本、错误数量、APK 路径
运行设备MuMu Android 模拟器模拟器或真机型号与 Android 版本
运行结果蓝色按钮可见,点击后应用仍在运行截图或具体操作过程
尚缺能力完整 uni-app 按钮属性、状态、事件明确列出未实现项目

记录时请把“看得到”“能拖入”“能保存”“能编译”“能运行”分成不同列。它们互相不能替代。正式发布前还应验证签名、包名、安装升级和目标安卓版本。

二十二、参考资料和文件入口

本页是离线 HTML,双击即可在浏览器打开;源码示例仅展示,不会在网页里编译或运行火山代码。复制按钮只复制可见代码。