MultipurposeMachine 标题栏统一封装改造方案
结论:建议把当前散落在各页面的 NetWorkStatusView、网络状态刷新、标题栏返回逻辑,逐步收敛到 BaseActivity。方向参考 ZhctWeightingTableYoukate 的 addTitleView,但不要原样照搬,应按 MultipurposeMachine 当前页面结构和标题栏尺寸做适配。
现状判断
NetWorkStatusView已在多个页面 XML 中重复声明,例如首页、设置页、人员新增、人脸管理、营养报告、餐单打印等页面。- 多个 Activity 重复持有
NetWorkStatusView字段,并在onStart()和EventBus回调中手动调用setConnectStatus()。 - 当前
BaseActivity只封装了进度框,尚未承接通用标题栏、网络状态和返回按钮行为。 - 项目已有
NetworkMonitor/NetworkState这类网络状态抽象,适合把 UI 刷新入口进一步集中。
改造目标
- 页面 XML 不再重复写同一套标题栏控件。
- 网络状态图标的初始化、事件订阅和状态刷新统一由
BaseActivity处理。 - 普通页面的返回按钮默认
finish(),特殊页面可以覆盖返回策略。 - 首页、设置页等特殊视觉比例不被统一封装破坏。
- 迁移过程中保持可回退,每次只改一组页面并构建验证。
推荐架构
1. 标题栏仍保留为独立 View
继续复用现有 NetWorkStatusView,不要急着拆成多个小控件。它已经承载 logo、网络图标、时间、日期、返回按钮和长按设置入口,短期内作为统一标题栏组件更稳。
2. BaseActivity 负责装配和状态
在 BaseActivity 中新增标题栏配置能力,例如:
setTitleStyle(TITLE_HOME):首页样式,隐藏返回按钮,允许 logo 长按进入设置。setTitleStyle(TITLE_BACK):普通二级页样式,展示返回按钮,默认返回当前页面。setTitleStyle(TITLE_NONE):特殊页面不注入标题栏,例如 crash 页面、串口测试页如需独立全屏时可使用。
3. 提供特殊返回钩子
SettingActivity 当前返回前需要执行初始化配置校验,不能简单 finish()。建议在 BaseActivity 提供 protected void onTitleBackClick(),默认 finish();设置页覆盖该方法调用现有 backChecker()。
4. 网络状态只保留一个 UI 订阅入口
页面不再各自写 @Subscribe NETWORK_STATUS_CHANGE 只为了刷新标题栏。BaseActivity 统一订阅网络事件并调用标题栏 setConnectStatus()。页面如有业务级网络逻辑,再单独订阅业务事件。
分阶段实施方案
| 阶段 | 动作 | 重点风险 | 验证方式 |
|---|---|---|---|
| 阶段 1 | 在 BaseActivity 增加标题栏注入、样式配置、网络状态刷新和返回钩子;先不迁移页面。 |
避免影响已继承 BaseActivity 但不需要标题栏的页面。 |
构建通过;确认未调用标题栏配置时行为不变。 |
| 阶段 2 | 迁移普通二级页面:AddPersonActivity、FaceManagerActivity、NutritionReportActivity、MenuPrintActivity。 |
移除 XML 标题栏后内容区域高度是否变化;返回按钮是否仍符合预期。 | 逐页启动,检查标题栏、返回、网络图标变化。 |
| 阶段 3 | 迁移 SettingActivity,覆盖标题栏返回钩子,复用现有 backChecker()。 |
初始化未完成时不能绕过配置校验直接返回首页。 | 验证配置未完成、模型未激活、配置完成三种返回路径。 |
| 阶段 4 | 最后评估首页 MainActivity 和启动页 StartActivity 是否接入统一标题栏。 |
首页当前使用 ConstraintLayout 百分比定位,直接外包标题栏可能改变视觉比例。 |
用截图对比首页布局,确认标题块、欢迎语、功能卡片没有被压缩或错位。 |
| 阶段 5 | 清理各页面重复的网络状态字段、导入、@Subscribe 和 XML 标题栏声明。 |
不要删除仍被弹窗或业务流程引用的 NetWorkStatusView API。 |
rg "NetWorkStatusView|setConnectStatus|NETWORK_STATUS_CHANGE" 复核剩余引用。 |
不建议的做法
- 不建议把
ZhctWeightingTableYoukate的BaseActivity原样复制过来;两个项目的标题栏高度、首页结构、设置页返回规则并不一致。 - 不建议一次性迁移所有页面;当前工作区已有较多未提交改动,标题栏改造应保持独立批次。
- 不建议先删除
NetWorkStatusView;应先集中装配,再视重复逻辑情况决定是否拆分内部实现。 - 不建议让每个页面继续保留网络状态订阅;否则统一标题栏只解决了 XML 重复,没有解决状态逻辑重复。
建议修改清单
app/src/main/java/com/zhct/multipurpose/application/BaseActivity.java:新增标题栏注入、样式配置、网络状态监听、返回钩子。app/src/main/java/com/zhct/multipurpose/widget/NetWorkStatusView.java:保留现有 UI,补充必要的外部配置方法,例如设置返回回调、控制 logo 长按入口。app/src/main/res/layout/activity_*.xml:分批移除重复声明的NetWorkStatusView。- 各 Activity:分批删除仅用于标题栏网络图标的字段、导入、
onStart()刷新和@Subscribe回调。
验收标准
- 构建通过:优先使用当前项目已验证的 JDK 8 方式执行
sh gradlew assembleDebug。 - 普通页面返回按钮行为一致。
- 设置页返回前置校验不被绕过。
- 断网、连 WiFi、连以太网场景下标题栏图标可恢复并实时刷新。
- 首页布局在目标设备分辨率下不出现标题栏挤压、内容下移或卡片错位。
- 全文检索后,只有真正需要业务网络事件的页面保留
NETWORK_STATUS_CHANGE订阅。
记录机制说明
当前项目已在提示词仓库建立改动记录机制:
- 记录目录:
/Users/liang/AndroidStudioProjects/zhct/zhctprompt/work_android/MultipurposeMachine/change_records/ - 记录脚本:
change_records/scripts/record_change.sh - 源码仓库本地提交钩子:
/Users/liang/AndroidStudioProjects/MultipurposeMachine/.git/hooks/pre-commit
后续进入代码实施阶段时,提交前会自动追加 staged 改动记录;非提交型方案文档则直接落在提示词仓库对应项目目录。