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),仅供参考