For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (
- [x]) syntax for tracking.
Goal: 新增功能选择页和消费页骨架,建立页面导航,为三个功能卡片增加对应图标,并让功能选择页支持长按标题栏 Logo 验证密码后进入设置。
Architecture: 采用独立 Activity 导航:FunctionSelectActivity 负责三个功能入口,ConsumptionActivity 提供消费页骨架,HomeActivity 继续承载绑盘业务。功能卡片由可点击父布局承载矢量图标和文字,子控件通过父状态同步切换颜色;通用标题栏对任意 Activity 复用现有管理员密码弹窗。
Tech Stack: Java 8、AndroidX FragmentActivity、Android XML、EventBus 3.3.1、现有 NetWorkStatusView 与 ToastUtils。
BaseTitleActivity.java:两个新页面共用的标题栏网络状态生命周期。FunctionSelectActivity.java:三个功能入口及跳转行为。ConsumptionActivity.java:消费页骨架及返回行为。strings.xml、colors.xml:集中维护新增文案和颜色。activity_home.xml、HomeActivity.java:显示并接管绑盘页标题栏返回入口。AndroidManifest.xml:注册两个横屏 Activity。NetWorkStatusView:允许任意 Activity 使用标题栏 Logo 长按密码入口。Files:
Create: app/src/main/res/drawable/function_card_background.xml
Create: app/src/main/res/drawable/function_card_normal.xml
Create: app/src/main/res/drawable/function_card_pressed.xml
Create: app/src/main/res/color/function_card_text_color.xml
Create: app/src/main/res/layout/activity_function_select.xml
Create: app/src/main/res/layout/activity_consumption.xml
Modify: app/src/main/res/values/strings.xml
Modify: app/src/main/res/values/colors.xml
Step 1: 增加颜色和文案
<color name="function_card_normal">#E6FFFFFF</color>
<color name="function_card_pressed">#CC3455AE</color>
<color name="function_card_stroke">#99FFFFFF</color>
<color name="function_card_text">#3455AE</color>
<color name="function_card_text_pressed">#FFFFFF</color>
<string name="function_binding">绑盘</string>
<string name="function_consumption">消费</string>
<string name="function_order_management">订单管理</string>
<string name="function_developing">开发中</string>
普通态 function_card_normal.xml 使用半透明白色、18dp 圆角和 2dp 白色描边;按压态 function_card_pressed.xml 使用蓝色、18dp 圆角和 3dp 白色描边。function_card_background.xml 切换背景,function_card_text_color.xml 同步实现普通态蓝字与按压态白字。背景 selector 内容为:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@drawable/function_card_pressed" />
<item android:drawable="@drawable/function_card_normal" />
</selector>
activity_function_select.xml 使用 @drawable/home_bac 根背景。顶部放 ID 为 function_status_view 的 NetWorkStatusView,不显示返回按钮;中央横向 LinearLayout 放三个 TextView 卡片。每张卡片使用 selector 背景、300dp × 260dp、左右 24dp 间距、42sp 粗体居中文字、10dp elevation,并设置 clickable/focusable。ID 为 function_binding_card、function_consumption_card、function_order_card。
activity_consumption.xml 使用 @drawable/home_bac 根背景。顶部放 ID 为 consumption_status_view 的 NetWorkStatusView,宽高和边距沿用 activity_setting.xml,并配置:
app:showBackLayoutTag="true"
app:iconLongClickTag="false"
Run: rg -n "function_(binding|consumption|order_management|developing)|function_card_" app/src/main/res
Expected: 四个字符串、五个颜色、三个 drawable、一个文字颜色 selector 及三个卡片引用均被检出。
Files:
Create: app/src/main/java/com/zhct/traybinding/main/BaseTitleActivity.java
Create: app/src/main/java/com/zhct/traybinding/main/FunctionSelectActivity.java
Create: app/src/main/java/com/zhct/traybinding/main/ConsumptionActivity.java
Step 1: 实现 BaseTitleActivity
继承 FragmentActivity。onCreate() 注册 EventBus,onDestroy() 解除注册。initializeStatusView(int) 获取 NetWorkStatusView 并用 NetworkStatusUtils.getCurrentStatus(this) 初始化。订阅 EventName.NETWORK_CHANGE 后更新 setConnectStatus(event.isAvailable());仅在“连接但无互联网”从否变为是时使用 ToastUtils 显示 net_work_connected_no_internet。
FunctionSelectActivity设置 activity_function_select 并绑定三个入口:
if (id == R.id.function_binding_card) {
startActivity(new Intent(this, HomeActivity.class));
finish();
} else if (id == R.id.function_consumption_card) {
startActivity(new Intent(this, ConsumptionActivity.class));
} else if (id == R.id.function_order_card) {
ToastUtils.toast(this, getString(R.string.function_developing));
}
ConsumptionActivity设置 activity_consumption,初始化通用标题栏,将标题栏返回和 onBackPressed() 都绑定到:
private void returnToFunctionSelect() {
Intent intent = new Intent(this, FunctionSelectActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);
finish();
}
Run: rg -n "class (BaseTitleActivity|FunctionSelectActivity|ConsumptionActivity)|function_(binding|consumption|order)_card|returnToFunctionSelect" app/src/main/java/com/zhct/traybinding/main
Expected: 三个新类、三个点击入口和统一返回方法均被检出。
Files:
Modify: app/src/main/res/layout/activity_home.xml
Modify: app/src/main/java/com/zhct/traybinding/main/HomeActivity.java
Modify: app/src/main/AndroidManifest.xml
Step 1: 显示 Home 返回按钮
将 activity_home.xml 的 app:showBackLayoutTag 从 false 改为 true。
在 HomeActivity.initViews() 初始化 mNetWorkStatusView 后增加:
mNetWorkStatusView.getBackLayout().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(HomeActivity.this, FunctionSelectActivity.class));
finish();
}
});
实体返回键原有“应用使用中,请勿退出”逻辑保持不变。
<activity
android:name=".main.FunctionSelectActivity"
android:screenOrientation="landscape" />
<activity
android:name=".main.ConsumptionActivity"
android:screenOrientation="landscape" />
Run: rg -n "FunctionSelectActivity|ConsumptionActivity|showBackLayoutTag" app/src/main/AndroidManifest.xml app/src/main/java/com/zhct/traybinding/main app/src/main/res/layout
Expected: Manifest 注册两个页面;Home 和消费页显示返回;功能选择页不显示返回;跳转目标完整。
Files:
Create: /Users/liang/AndroidStudioProjects/zhct/zhctprompt/work_android/ZhctTrayBindingMachine/change_records/2026-08-25-function-selection-navigation.md
Create: /Users/liang/AndroidStudioProjects/zhct/zhctprompt/work_android/ZhctTrayBindingMachine/change_records/2026-08-25-function-selection-navigation.html
Step 1: 检查格式问题
Run: git diff --check
Expected: 无输出且退出码为 0;该命令只读,不暂存或提交。
执行 JAVA_HOME=/Users/liang/Library/Java/JavaVirtualMachines/corretto-1.8.0_482/Contents/Home bash ./gradlew :app:assembleDebug。
Expected: BUILD SUCCESSFUL,Debug APK 成功生成。
记录新增类与页面职责、卡片按压 selector、Home 返回入口、Manifest 注册,以及静态检查和构建的实际结果。Markdown 与 HTML 使用相同标题、变更结论和验证结论。
Run: git status --short
Run: git diff -- app/src/main/AndroidManifest.xml app/src/main/java/com/zhct/traybinding/main/HomeActivity.java app/src/main/res/layout/activity_home.xml app/src/main/res/values/strings.xml app/src/main/res/values/colors.xml
Expected: 仅出现本计划范围内的项目文件变化;不执行暂存、提交、推送、分支切换或其他 Git 写操作。
Files:
Create: app/src/main/res/drawable/ic_function_binding.xml
Create: app/src/main/res/drawable/ic_function_consumption.xml
Create: app/src/main/res/drawable/ic_function_order.xml
Modify: app/src/main/res/layout/activity_function_select.xml
Modify: app/src/main/java/com/zhct/traybinding/widget/NetWorkStatusView.java
Step 1: 创建三枚统一矢量图标
三枚 vector 均使用 72dp × 72dp viewport,path 使用白色基色,由 ImageView 的颜色 selector 统一着色,不引用第三方图标库。
ic_function_binding.xml:
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="72dp"
android:height="72dp"
android:viewportWidth="72"
android:viewportHeight="72">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M10,52h52v6H10zM16,46c0,-13.25 10.75,-24 24,-24s24,10.75 24,24h-6c0,-9.94 -8.06,-18 -18,-18s-18,8.06 -18,18zM36,14h8v8h-8z" />
</vector>
ic_function_consumption.xml:
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="72dp"
android:height="72dp"
android:viewportWidth="72"
android:viewportHeight="72">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M8,8h44v8H8v44h48v-4H46c-6.63,0 -12,-5.37 -12,-12s5.37,-12 12,-12h10v-8H8v36h48v-4h8v4c0,4.42 -3.58,8 -8,8H8c-4.42,0 -8,-3.58 -8,-8V16c0,-4.42 3.58,-8 8,-8zM46,38h22v12H46c-3.31,0 -6,-2.69 -6,-6s2.69,-6 6,-6zM48,41a3,3 0,1 0,0 6a3,3 0,1 0,0 -6z" />
</vector>
ic_function_order.xml:
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="72dp"
android:height="72dp"
android:viewportWidth="72"
android:viewportHeight="72">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M16,8h40v8h8v52H8V16h8zM24,14v8h24v-8zM16,30h8v8h-8zM30,30h24v8H30zM16,46h8v8h-8zM30,46h24v8H30z" />
</vector>
保留 function_binding_card、function_consumption_card、function_order_card 三个父布局 ID 和原卡片尺寸、背景、点击属性。在每个纵向 LinearLayout 中放置:
<ImageView
android:layout_width="104dp"
android:layout_height="104dp"
android:duplicateParentState="true"
android:src="@drawable/ic_function_binding"
android:tint="@color/function_card_text_color" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:duplicateParentState="true"
android:text="@string/function_binding"
android:textColor="@color/function_card_text_color"
android:textSize="42sp"
android:textStyle="bold" />
消费和订单卡片分别替换 drawable、文案和 contentDescription。duplicateParentState 保证按压父卡片时,子图标和文字同步从蓝色变为白色。
将 activity_function_select.xml 的标题栏属性改为:
app:iconLongClickTag="true"
保留 NetWorkStatusView 默认返回逻辑所需的 HomeActivity import,仅将长按判断改为:
if (mContext instanceof Activity) {
new CustomPwdInputDialog((Activity) mContext);
}
return true;
继续复用 CustomPwdInputDialog 和 PwdInputDialogUtils,不修改密码值、输入限制、日志、错误提示或进入设置页的行为。
Run: rg -n "ic_function_(binding|consumption|order)|duplicateParentState|iconLongClickTag=\"true\"|new CustomPwdInputDialog" app/src/main/res app/src/main/java/com/zhct/traybinding/widget/NetWorkStatusView.java
Expected: 三枚图标均被对应卡片引用,六个子控件继承父状态,功能选择页开启长按,通用标题栏使用 Activity 创建原密码弹窗。
Files:
Modify: /Users/liang/AndroidStudioProjects/zhct/zhctprompt/work_android/ZhctTrayBindingMachine/change_records/2026-08-25-function-selection-navigation.md
Modify: /Users/liang/AndroidStudioProjects/zhct/zhctprompt/work_android/ZhctTrayBindingMachine/change_records/2026-08-25-function-selection-navigation.html
Step 1: 运行格式检查
Run: git diff --check
Expected: 无输出且退出码为 0。
Run: JAVA_HOME=/Users/liang/Library/Java/JavaVirtualMachines/corretto-1.8.0_482/Contents/Home bash ./gradlew -q :app:assembleDebug
Run: JAVA_HOME=/Users/liang/Library/Java/JavaVirtualMachines/corretto-1.8.0_482/Contents/Home bash ./gradlew -q :app:testDebugUnitTest
Expected: 两条命令退出码均为 0。
在既有变更记录中补充三枚功能图标、父子按压状态同步、功能选择页 Logo 长按密码弹窗、通用标题栏 Activity 泛化,以及最新构建和测试结果;Markdown 与 HTML 保持一致。