欢迎光临
我们一直在努力

智叟云集系统Android 客户端的页面布局与状态呈现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */
#content_views .toc,
/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */
#content_views.markdown_views > p:empty:has(+ .toc),
#content_views.markdown_views > .toc + p:empty,
/* 富文本旧版目录标记 */
#content_views.htmledit_views #main-toc,
#content_views.htmledit_views #hr-toc,
#content_views.htmledit_views p[id*=\”-toc\”] {
display: none !important;
}
/* 目录去掉后,紧跟的首个标题不再多出一块上边距 */
#content_views.markdown_views > .toc + h1,
#content_views.markdown_views > .toc + h2,
#content_views.markdown_views > .toc + h3,
#content_views.markdown_views > .toc + h4,
#content_views.markdown_views > .toc + p:empty + h1,
#content_views.markdown_views > .toc + p:empty + h2,
#content_views.markdown_views > .toc + p:empty + h3,
#content_views.markdown_views > .toc + p:empty + h4 {
margin-top: 0 !important;
}

Android 客户端的页面布局与状态呈现

技术文章 02   2026年11月6日   本地主目录代码基准

Android 客户端使用 Java 和原生视图组件构建界面。MainActivity 组织标题、内容容器和底部导航,并把读取到的字段转换为页面文字。本文说明视图层级、页面切换、状态文本和尺寸处理的代码关系。

  01  原生视图的容器层级

MainActivity 在 onCreate 中创建纵向 LinearLayout 作为根容器。根容器依次放置标题区域、内容区域和底部导航。内容区域使用 FrameLayout,每个页面使用一个 ScrollView,滚动容器内部再放置纵向 LinearLayout 承载文本和按钮。

内容 FrameLayout 的高度设为 0,并使用权重 1,占据标题和导航之外的剩余空间。各页面的 ScrollView 填满内容容器,页面中的长记录通过内部滚动显示。底部导航位于根容器中,因此不需要跟随记录列表滚动。

容器创建顺序决定层级关系,LayoutParams 决定控件在父容器中的尺寸规则。MATCH_PARENT、WRAP_CONTENT 与权重分别表达填充、内容尺寸和剩余空间分配。下列代码对应内容区的建立,截图显示记录内容与底部导航分开的页面区域。

FrameLayout frame = new FrameLayout(this);
root.addView(frame,
    new LinearLayout.LayoutParams(-1, 0, 1));
ScrollView scroll = new ScrollView(this);
scroll.setFillViewport(true);

代码位置  android/app/src/main/java/cn/zhisou/agent/MainActivity.java · 片段

图 1A  原生视图的容器层级流程

图 1B  任务页面记录卡片  本地存档截图裁切

记录列表位于滚动内容区,导航位于页面底部。

技术文章 02   Android 客户端的页面布局与状态呈现

  02  页面切换与选中状态

客户端底部包含首页、任务、设备、设置四个入口。创建导航时,每个入口保存自己的索引,点击事件把索引传入 selectPage。页面切换使用 View.VISIBLE 和 View.GONE 控制已创建页面的可见性,未选中的页面不参与显示布局。

selectPage 将输入索引限制在 0 至 3 之间,再更新页面可见性、导航选中状态、文字颜色和图标。标题与说明文字也根据当前页索引更新。页面内容与导航状态由同一次切换处理,避免只改变标签而未改变内容区域。

onCreate 从 saved 状态中读取 page 值,没有记录时使用第 0 页。页面索引负责选择展示区域,不承载页面数据本身。下面摘录页面索引及可见性处理;截图展示任务标签处于选中状态时的底部导航。

selectedPage = Math.max(0, Math.min(3, page));
for (int i = 0; i < 4; i++) {
    boolean active = i == selectedPage;
    pages[i].setVisibility(
        active ? View.VISIBLE : View.GONE);
}

代码位置  android/app/src/main/java/cn/zhisou/agent/MainActivity.java · selectPage 片段

图 2A  页面切换与选中状态流程

图 2B  任务标签选中状态  本地存档截图裁切

标签颜色与图标状态属于同一页面选择结果。

技术文章 02   Android 客户端的页面布局与状态呈现

  03  设备字段到界面文字

设备页面将电量、充电状态、电池温度、屏幕状态、网络和可用存储等字段组成文本。数值字段附带单位,布尔字段转换成中文状态,字符串字段直接进入对应位置。显示结果由 TextView.setText 写入页面。

MainActivity 使用 StringBuilder 组合多行设备信息,之后一次设置到健康信息控件。组合过程读取 JSONObject 中的字段,getInt、getBoolean、getString 与字段类型对应。缺失或格式错误的字段可能触发异常,页面会显示健康信息读取失败的提示。

显示层对“充电中”与“未充电”的转换只是布尔值映射。截图中的电量和温度是存档时的设备值,不表示当前设备状态。下列示例保留电量和充电状态的字符串组合方法;单位与状态词在代码中明确给出。

StringBuilder s = new StringBuilder();
s.append("电量 ").append(h.getInt("battery_percent"))
 .append("% · ")
 .append(h.getBoolean("charging")
     ? "充电中" : "未充电");
health.setText(s.toString());

代码位置  android/app/src/main/java/cn/zhisou/agent/MainActivity.java · 显示逻辑节选

图 3A  设备字段到界面文字流程

图 3B  设备页面电量与温度区域  本地存档截图裁切

数值和状态词分别由数值字段与布尔字段生成。

技术文章 02   Android 客户端的页面布局与状态呈现

  04  尺寸单位与系统窗口边距

界面使用 dp 方法将逻辑尺寸转换为像素,文字使用 TextView 的字号设置。根容器通过窗口 Insets 获得系统边距,并把边距设置到根视图。内容区的外边距、卡片内边距和底部导航尺寸由不同层级分别管理。

系统状态栏和导航栏占用的区域随设备设置变化。onApplyWindowInsets 回调读取四个方向的系统边距,使应用内容布局根据实际窗口调整。页面中用于展示长文本的对话框采用 ScrollView 包裹 TextView,并将文字设为可选择。

尺寸处理对应布局,文字选择对应交互,两者分别配置。下面代码摘录长文本显示控件的设置。截图中的记录卡片包含多行文字和按钮,说明内容高度取决于实际文字与控件,而不是一张固定高度的图片。

TextView body = new TextView(this);
body.setText(value);
body.setTextSize(14);
body.setTextIsSelectable(true);
body.setPadding(dp(20), dp(12), dp(20), dp(20));
scroll.addView(body);

代码位置  android/app/src/main/java/cn/zhisou/agent/MainActivity.java · showText 片段

图 4A  尺寸单位与系统窗口边距流程

图 4B  本地记录文字与查看按钮  本地存档截图裁切

同一记录区域包含文本和交互控件,正文长度影响所需显示空间。

赞(0)
未经允许不得转载:171主机测评 » 智叟云集系统Android 客户端的页面布局与状态呈现
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址