Android-WizardPager状态保存完全指南:save()/load()让向导流程完美恢复现场
示例工程移动开发【免费下载链接】Android-WizardPagerAndroid pager-style wizard flow sample code项目地址https://gitcode.com/gh_mirrors/an/Android-WizardPager点击查看免费下载Android-WizardPager 是一个基于 ViewPager 的向导式wizardUI 示例项目用「三明治点单」演示多步骤表单的完整流程。填到一半屏幕突然旋转之前选的所有选项会消失吗不会——靠的就是它的状态保存机制。本文带你完全看懂save()与load()这两个方法如何让向导流程在旋转屏幕、进程重建后完美恢复现场一步不丢、一个选项不错。一、先认识 Android-WizardPager一个三明治点单向导这个项目来自 Google 官方示例模拟了在线点三明治的场景步骤页面类型1Order type订单类型分支页Sandwich / Salad2Bread、Meats、Veggies、Cheeses、Toasted?…单选 / 多选 / 嵌套分支…Salad type、Dressing…仅在选 Salad 时出现倒数第 2 页Your info姓名、邮箱文本输入最后一页Review确认汇总只读汇总整个向导的骨架定义在 SandwichWizardModel.java 中用PageList把各页串成链用BranchPage表达选了 Sandwich 才出现面包页这类依赖关系。 关键认知页面结构是树但用户看到的是一条根据选择实时展开的扁平步骤序列。二、为什么向导流程必须做状态保存Android 有一个对新手不太友好的机制屏幕旋转、分屏、甚至内存不足时系统会销毁并重建 Activity。如果什么都没做用户辛辛苦苦选好的面包、肉类、填好的姓名会全部归零。Android-WizardPager 的解法非常干净数据与视图分离。数据集中存放在 Model 层每一页Page内部各持有一个Bundle mData视图Fragment只负责把mData里的值显示出来用户操作时再写回。只要数据能被存下来、读回去界面随时可以无损重建。数据容器的定义见 Page.javapublic static final String SIMPLE_DATA_KEY _; // 单选页的统一数据键 protected Bundle mData new Bundle(); // 本页的全部填写数据不同页面往mData里写的值类型不同页面类型写入方式例子单选含分支putString(SIMPLE_DATA_KEY, ...)Wheat多选putStringArrayList(SIMPLE_DATA_KEY, ...)[Ham, Pickles]文本姓名/邮箱putString(NAME_DATA_KEY / EMAIL_DATA_KEY, ...)Alice写入动作就发生在各 Fragment 里例如单选页点击列表项后写回并通知刷新见 SingleChoiceFragment.java文本页则是输入框每敲一个字符就同步写回见 CustomerInfoFragment.java。三、save()把整个向导拍一张快照状态保存的核心就两个方法都在 AbstractWizardModel.java 中public Bundle save() { Bundle bundle new Bundle(); for (Page page : getCurrentPageSequence()) { bundle.putBundle(page.getKey(), page.getData()); } return bundle; }逻辑用大白话讲就是三步取当前步骤序列getCurrentPageSequence()把页面树按用户当前选择压扁成列表比如选了 Sandwich列表里就是 Bread → Meats → … → Your info每页取唯一 keyPage.getKey()生成形如Sandwich:Bread、Your info的索引名带分支前缀的页面用父选择:标题命名见 Page.java整页数据装箱把每页的mData本身是个 Bundle以 key 为名放进一个大 Bundle返回。得到的结果等价于{ Order type → {_: Sandwich}, Sandwich:Bread → {_: Wheat}, Your info → {name: Alice, ...}, … }——一张完整快照。四、load()让向导恢复现场恢复是save()的逆过程public void load(Bundle savedValues) { for (String key : savedValues.keySet()) { mRootPageList.findByKey(key).resetData(savedValues.getBundle(key)); } }逐个取出快照里的 key按 key 找回对应页面findByKey沿着页面树含分支子树递归查找重置数据resetData()直接替换mData并调用notifyDataChanged()触发所有监听者包括确认页 ReviewFragment刷新见 Page.java。之后 Fragment 重新创建视图时会从page.getData()里读出旧值自动预填单选页恢复勾选SingleChoiceFragment.java、多选页恢复多个勾选MultipleChoiceFragment.java、文本页恢复姓名邮箱CustomerInfoFragment.java。用户看到的就是一切如旧。五、在 Activity 中接线只需两行关键代码把save()/load()接入 Android 生命周期在 MainActivity.java 里各只需一段保存时机—— 覆写onSaveInstanceState系统即将销毁页面前自动回调outState.putBundle(model, mWizardModel.save()); // L175-L178恢复时机——onCreate中判断savedInstanceState是否非空非空说明是重建而非首次启动if (savedInstanceState ! null) { mWizardModel.load(savedInstanceState.getBundle(model)); // L65-L67 }⚠️ 注意顺序load()发生在registerListener(this)和 ViewPager 装配之前所以数据先就位界面再依据数据渲染不会出现空白闪一下再填充的尴尬。Bundle 由系统负责真正持久化到磁盘App 不需要自己写文件。六、分支页面为什么也能恢复这是最容易让新手困惑的一点选了 Salad 后Sandwich 分支里的页面根本不在当前序列里它们的 key 也从未出现在快照中会不会出错不会。原因有二save()只遍历当前展开的序列快照里只有当前这条路的页面恢复时页面树是依据BranchPage里保存的选择值重新展开的——flattenCurrentPageSequence()只把与mData中选项匹配的分支加入序列见 BranchPage.java。也就是说只要Order type: Sandwich这个值被恢复Bread 等页面就会重新出现在序列里它们自己的旧选择也一并就位。另外分支页还支持代码里预设默认值例如Toasted?页默认选 NoSandwichWizardModel.java保证新建流程也有起点。七、新手常见疑问 FAQQ1为什么数据存在 Model 里而不是存在 Fragment 里Fragment 生命周期更脆弱销毁重建是家常便饭而 Model 由 Activity 持有、统一用 Bundle 存取天然适合做唯一数据源。界面只是数据的投影。Q2旋转屏幕后当前停在第几页也能恢复吗能。ViewPager 的当前页位置由 FragmentManager 机制随savedInstanceState一并保存配合数据恢复连滑到第几步都不会丢。Q3这份 Bundle 快照能保存多久它保存在系统维护的 Activity 实例状态里覆盖配置变更和后台进程短暂被杀的场景若进程被彻底杀死且系统状态也失效则回到全新开始需要跨重启持久化得另存数据库/文件。Q4我想给自己的向导加状态保存要改哪里照抄这套三层套路即可① 每页模型持有一个 Bundle② 提供save()/load()两个方法按 key 存取③ 在 Activity 的onSaveInstanceState/onCreate里接两行线。八、总结Android-WizardPager 的状态保存机制精髓可以浓缩为一句话把向导数据抽象成按 key 索引的 Bundle 集合保存是打包、恢复是解包。环节关键方法位置拍快照save()AbstractWizardModel.java恢复现场load()AbstractWizardModel.java页面换数据resetData()Page.java生命周期接线onSaveInstanceState/onCreateMainActivity.java理解了这个模式再去看任何多步骤表单注册、结算、问卷的状态保持都能一眼看懂其中的脉络。赞分享示例工程移动开发【免费下载链接】Android-WizardPagerAndroid pager-style wizard flow sample code项目地址https://gitcode.com/gh_mirrors/an/Android-WizardPager点击查看免费下载相关推荐Fluent UI应用崩溃恢复终极指南5步实现完美状态保存与恢复Fluent UI应用崩溃恢复终极指南5步实现完美状态保存与恢复 Fluent UI作为微软官方的前端UI组件库提供了强大的企业级React组件解决方案。在前端UI组件设计系统komorebi 窗口尺寸布局保存与恢复save-resize / load-resize 命令完整实战指南komorebi 窗口尺寸布局保存与恢复save resize / load resize 命令完整实战指南 导读 save resize 是 komoreb桌面应用如何快速上手Orbit新手入门10个技巧 如何快速上手Orbit新手入门10个技巧 Orbit是一个革命性的 间隔重复记忆平台 专为帮助人们长期记住重要信息而设计。如果你厌倦了学完就忘的困境创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

HTTPS环境下SSE实时推送:EventSource与Nginx配置避坑指南

HTTPS环境下SSE实时推送:EventSource与Nginx配置避坑指南

最近在做一个运营后台的实时消息推送需求:服务端有新的订单状态变更、告警消息,需要第一时间推到浏览器页面上,延迟还要控制在秒级以内。技术选型的时候我在 WebSocket 和轮询之间纠结了一阵,最后落到了 JavaScript 的SSE&#xf…

2026/10/15 22:44:11 阅读更多 →
PyTorch到TensorFlow模型转换:ONNX链路避坑全指南

PyTorch到TensorFlow模型转换:ONNX链路避坑全指南

前段时间我把一个 PyTorch 训练的语义分割模型送到生产环境,目标推理框架是 TensorFlow Serving,中间必须走一遍 pytorch → onnx → tensorflow 的转换链路。一开始我以为就是两行命令的事,结果前后折腾了两周,踩的坑数量远超预期…

2026/10/15 22:44:11 阅读更多 →
tfsec 规则详解:aws-athena-no-encryption-override——强制 Athena 工作组加密配置,防止客户端覆盖

tfsec 规则详解:aws-athena-no-encryption-override——强制 Athena 工作组加密配置,防止客户端覆盖

应用安全SASTIaC 【免费下载链接】tfsec Tfsec is now part of Trivy 项目地址: https://gitcode.com/gh_mirrors/tf/tfsec 点击查看 免费下载 本篇技术指南围绕 tfsec 内置检查规则 aws-athena-no-encryption-override 展开,讲解如何在 Terraform 中通…

2026/10/15 22:44:11 阅读更多 →

最新新闻

区块链数据结构入门:哈希、椭圆曲线与数字签名

区块链数据结构入门:哈希、椭圆曲线与数字签名

这个系列走到第二讲,按标题规划,该进入区块链的数据结构了。但说实话,我每次带新人入门,都会在这里纠正一个期待:真正卡住人的不是链表、不是树,而是隐藏在数据结构底下的密码学基础。第二讲这一篇&#xf…

2026/10/15 23:26:43 阅读更多 →
文本驱动图表生成:用DSL自动输出SVG架构图

文本驱动图表生成:用DSL自动输出SVG架构图

diagram-design 这个项目,一句话讲,是我写的一个把结构化文本自动变成矢量图表的命令行小工具。起因很简单:平时做技术方案和项目汇报,总要画架构图、流程图,手动拖框拉线特别消耗时间,而且需求一旦变动&am…

2026/10/15 23:26:43 阅读更多 →
ODrive串口调试速查:从接线到控制的完整命令指南

ODrive串口调试速查:从接线到控制的完整命令指南

做无刷电机伺服控制,很多人第一块板子就是ODrive。这板子的性能不展开说了,但真正把它“驯服”的第一步,几乎都是从串口开始的。ODrive的ASCII协议走UART,命令格式简单到一眼能看懂,但它最大的问题不是难,而…

2026/10/15 23:26:43 阅读更多 →
从设备树到GPIO子系统:Linux LED驱动完整实现指南

从设备树到GPIO子系统:Linux LED驱动完整实现指南

很多做嵌入式Linux的朋友,都是从“点灯”这一步开始接触驱动开发的。我当年拿到一块新板子,第一件事就是翻原理图、找LED对应的GPIO引脚,然后想着怎么在Linux里把它点亮。结果上来就踩了一个大坑——在裸机上点灯,你只需要把某个寄…

2026/10/15 23:26:43 阅读更多 →
因果推断入门指南:从相关到因果的建模决策与避坑实践

因果推断入门指南:从相关到因果的建模决策与避坑实践

简介:《The Book of Why》中文版PDF电子书,面向数据科学从业者、统计学习者及希望提升因果推理能力的决策者,帮助读者跳出“相关不等于因果”的认知误区,系统掌握从数据中提取因果信息的思维框架。全书围绕“因果关系之梯”展开&a…

2026/10/15 23:26:43 阅读更多 →
Visual Studio 2026 中 GitHub Copilot 大模型接入 TaoToken 的配置大纲

Visual Studio 2026 中 GitHub Copilot 大模型接入 TaoToken 的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 23:25:42 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →