- 示例工程
- 移动开发
【免费下载链接】Android-WizardPager
Android pager-style wizard flow sample code
Android-WizardPager 是基于 ViewPager 的 Android 向导(Wizard)流程示例项目,以三明治/沙拉点单为 Demo,把"多步骤表单"拆解为逐页滑动的分步体验。本文将它当作工程蓝本,总结 6 个可直接迁移到注册、下单、申请等真实业务的实战技巧,帮你把 Demo 升级为生产可用的向导流程。
💡 获取代码:
git clone https://gitcode.com/gh_mirrors/an/Android-WizardPager
30秒看懂架构:模型—适配—操控的三层分工
整个向导由三层协作完成,职责非常清晰:
| 层级 | 核心文件 | 职责 |
|---|---|---|
| 模型层 | SandwichWizardModel.java | 声明式定义向导步骤、选项与数据 |
| 适配层 | MainActivity.MyPagerAdapter | 把当前页面序列转成 Fragment 页面 |
| 操控层 | MainActivity.java + activity_main.xml | ViewPager、顶部步骤条、上一步/下一步按钮 |
模型层通过 ModelCallbacks 接口向上层广播onPageDataChanged(数据变化)和onPageTreeChanged(页面树变化)两种事件,UI 只需监听事件刷新——这就是后面所有技巧的地基。
技巧1|用 AbstractWizardModel 声明式定义向导步骤,告别硬编码页面
Demo 中全部业务步骤集中在 SandwichWizardModel.java 的onNewRootPageList()一个方法里:
return new PageList( new BranchPage(this, "Order type") .addBranch("Sandwich", ...页面集合...) .addBranch("Salad", ...页面集合...), new CustomerInfoPage(this, "Your info").setRequired(true) );生产建议:每个业务(注册、开通、下单)写一个自己的 Model 子类,页面用 Page 的子类表达,例如:
- 单选页:SingleFixedChoicePage.java
- 多选页:MultipleFixedChoicePage.java
- 文本输入页:CustomerInfoPage.java
好处是步骤增删只改数据不改 UI,ViewPager 的页数、顶部步骤条、确认页内容全部自动联动(见 getCurrentPageSequence 将页面树"拍平"为当前序列)。
技巧2|用 BranchPage 构建动态流程:步骤随用户选择而变化
真实业务最常见的形态是"分支流程"——选了 A 才需要填 A 的表单。Demo 的 BranchPage 原生支持:点单页里"Toasted?"选 Yes,才会多出"Toast time"一步;选 No 则该步自动消失。
new BranchPage(this, "Toasted?") .addBranch("Yes", new SingleFixedChoicePage(this, "Toast time")...) .addBranch("No") .setValue("No");生产建议:把"套餐类型""证件类型""支付方式"这类决定后续步骤的字段都建成 BranchPage,用户切换选项时页面树自动重算,无需手写任何 if-else 导航逻辑。
技巧3|必填校验与截断机制:阻止用户跳过关键步骤
向导流程最典型的事故是"没填收货地址就点了提交"。Demo 用两道防线解决:
- 页面级必填标记:Page.setRequired(true);
- 截断页面(CutOff Page):MainActivity.recalculateCutOffPage 会找到"第一个未完成且必填的页",并让 Adapter 的页数截断在这里——用户物理上滑不到后面的页面,"下一步"按钮同时置灰。
生产建议:把校验规则(如邮箱格式)放进各 Page 子类的isCompleted()中(参考 CustomerInfoPage.isCompleted),校验逻辑与 UI 彻底解耦,方便单元测试。
技巧4|状态持久化:进程被杀后向导进度秒恢复
Android 随时可能回收进程,向导走到第 5 步数据全丢会是灾难。Demo 的做法极简:
- 保存:onSaveInstanceState 中调用
mWizardModel.save(),把所有页面数据打包成 Bundle; - 恢复:
onCreate里检测 savedInstanceState 并调用mWizardModel.load(bundle)。
生产建议:这是内存级保活。若产品要求"下次打开 App 继续填",把save()返回的 Bundle 序列化到本地存储(如 SharedPreferences/数据库),启动时再load()即可,模型层 API 完全复用。
技巧5|确认页 Review:让用户一键回改任意步骤
提交前汇总确认是降低投诉率的关键一步。Demo 的 ReviewFragment 会自动遍历当前页面序列,调用每页的getReviewItems()收集摘要(ReviewItem 还带 weight 控制排序),空值自动显示 "(None)"。
更妙的是点击任意一行即可跳回对应页修改:onListItemClick 携带 pageKey 回调 onEditScreenAfterReview,定位后底部按钮还会变身为"Review",改完一键返回确认页。
生产建议:为敏感字段(金额、手机号)自定义getReviewItems()的展示格式(如脱敏),确认页的交互框架直接照搬。
技巧6|提交确认对话框:接入真实业务前的最后一道闸
Demo 的"下一步"按钮在最后一页自动变为 "Submit order" 绿色按钮(updateBottomBar),点击后先弹出确认对话框(文案见 strings.xml),用户二次确认才真正提交。
生产建议:在这个确认回调里接入你的真实提交逻辑:
- 收集
mWizardModel.getCurrentPageSequence()中各 Page 的getData(),组装成订单/申请表单; - 提交请求建议放在后台线程或协程中执行,避免卡 UI;
- 成功后跳转结果页并销毁向导状态,失败则保留数据原地重试——向导模型的数据结构天然支持"失败不丢数据"。
总结:生产级向导流程检查清单
| 能力 | 对应机制 | 关键文件 |
|---|---|---|
| 声明式步骤定义 | onNewRootPageList() | SandwichWizardModel.java |
| 动态分支流程 | BranchPage.addBranch() | BranchPage.java |
| 必填校验 + 跳步拦截 | setRequired+ CutOff Page | MainActivity.java |
| 进程恢复 / 跨会话持久化 | save()/load() | AbstractWizardModel.java |
| 汇总确认 + 一键回改 | ReviewFragment + pageKey 定位 | ReviewFragment.java |
| 提交确认 + 真实业务接入 | 确认对话框 + 数据组装 | MainActivity.java |
掌握以上 6 点,你就拥有了一个步骤可配置、数据可校验、状态可恢复、提交有确认的完整向导方案——这正是 Android-WizardPager 从 Demo 走向生产环境的全部精髓。
- 示例工程
- 移动开发
【免费下载链接】Android-WizardPager
Android pager-style wizard flow sample code
相关推荐
AssetRipper:3步提取Unity游戏资产,直接转成可导入的工程
AssetRipper:3步提取Unity游戏资产,直接转成可导入的工程 AssetRipper是一款跨平台的Unity资产提取工具:把游戏里的 .assets
开发工具逆向工程游戏开发UNIT训练技巧大全:如何优化损失函数和超参数设置
UNIT训练技巧大全:如何优化损失函数和超参数设置 UNIT(Unsupervised Image to Image Translation)作为无监督图像翻译
实战llm-zoomcamp:真实业务场景应用
还在为如何将LLM技术落地到实际业务而苦恼吗?llm zoomcamp项目提供了一个完整的解决方案,让你在10周内学会构建能够回答知识库问题的AI系统。本文将带
示例工程教程人工智能大模型
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考