cw-omnibus 实战:使用 appcompat-v7 实现 Action Bar 覆盖(Overlay)模式
示例工程教程【免费下载链接】cw-omnibusSource code to omnibus edition of _The Busy Coders Guide to Android Development_项目地址https://gitcode.com/gh_mirrors/cw/cw-omnibus点击查看免费下载本文围绕开源仓库 cw-omnibusThe Busy Coders Guide to Android Development配套示例合集中的 AppCompat/Overlay 示例讲解如何让appcompat-v7的 Action Bar悬浮覆盖overlay在应用主内容之上而非挤压内容、独占一行的传统布局模式。读完本文你将掌握FEATURE_ACTION_BAR_OVERLAY的启用方式、半透明背景 drawable 的配置技巧以及 overlay 模式下内容布局与 Action Bar 的层级关系并可直接复用到自己的 AppCompat 项目中。一、什么是 Action Bar 覆盖Overlay模式在默认布局中Action Bar 占据窗口顶部的一段固定空间Activity 的内容区域被其向下推挤。而overlay 模式恰恰相反Action Bar 被悬浮在窗口之上Activity 的setContentView()内容可以一直延伸到屏幕顶部Action Bar 像浮层一样压住内容的最上沿。这种方式常被用于内容优先的阅读/浏览类界面让列表、图片或地图等可以充分利用整块屏幕配合半透明背景的 Action Bar让被覆盖的内容在 Bar 边缘若隐若现形成层次感。在 cw-omnibus 仓库中该主题对应两个互相印证的示例使用原生 Action Bar 的 ActionBar/OverlayNative以及本文主角——使用appcompat-v7后向兼容实现的 AppCompat/Overlay。两者实现思路一致差别仅在 API 调用层面详见第五节对比。二、核心一行supportRequestWindowFeature(Window.FEATURE_ACTION_BAR_OVERLAY)启用 overlay 模式的全部开关落在 Activity 的onCreate()中调用一次supportRequestWindowFeature()。以仓库源码 ActionBarDemoActivity.java 为例Override public void onCreate(Bundle state) { super.onCreate(state); supportRequestWindowFeature(Window.FEATURE_ACTION_BAR_OVERLAY); setContentView(R.layout.list_content_simple); initAdapter(); Drawable d getResources().getDrawable(R.drawable.action_bar_background); getSupportActionBar().setBackgroundDrawable(d); getSupportActionBar().setSplitBackgroundDrawable(d); }几个关键点需要特别留意必须使用support*前缀方法由于appcompat-v7用自己的AppCompatActivity见源码第 19 行的extends AppCompatActivity实现 Action Bar因此不能调用原生getWindow().requestFeature()而要调用supportRequestWindowFeature()参数同样传入Window.FEATURE_ACTION_BAR_OVERLAY。必须在setContentView()之前调用requestWindowFeature()系列方法必须在窗口特性尚未固定之前、即在setContentView()调用之前完成否则会抛出异常或静默失效。这是 Android 窗口机制的一个硬性约束。调用位置在super.onCreate()之后源码中supportRequestWindowFeature()位于super.onCreate(state)之后、setContentView()之前这是兼容写法中常见且安全的顺序。三、overlay 模式下的内容布局被 Action Bar 覆盖的内容在仓库中是 list_content_simple.xml 声明的一个标准ListViewListView xmlns:androidhttp://schemas.android.com/apk/res/android android:idandroid:id/list android:layout_widthmatch_parent android:layout_heightmatch_parent android:drawSelectorOnTopfalse /该布局以match_parent撑满窗口这正是 overlay 模式的意义所在——列表不再被 Action Bar 压缩而是铺满整屏列表第一行会钻到悬浮的 Action Bar 底下。对应的 Activity 继承AppCompatActivity并使用ArrayAdapter填充数据ActionBarDemoActivity.javaprivate void initAdapter() { words new ArrayListString(); for (int i 0; i 5; i) { words.add(items[i]); } adapter new ArrayAdapterString(this, android.R.layout.simple_list_item_1, words); setListAdapter(adapter); }数据源是一个包含 25 个单词的字符串数组lorem、ipsum、dolor……初始展示前 5 项每点击一次Add菜单项则追加一项。注意这里的items数组与原生示例 ActionBar/OverlayNative 完全一致体现了仓库中不同实现间同题异构的组织方式。四、半透明背景让悬浮效果真正可见若 Action Bar 不透明overlay 模式只会让人感觉列表被 Bar 挡住层次感无从谈起。本示例的精髓在于配套的半透明背景 drawable action_bar_background.xmlshape xmlns:androidhttp://schemas.android.com/apk/res/android android:shaperectangle solid android:color#AAFFFFFF/ /shape#AAFFFFFF是alpha 为 0xAA约 67%的白色也就是约 33% 的透明度将它通过getSupportActionBar().setBackgroundDrawable(d)设置为 Action Bar 背景后被覆盖的列表内容会透过 Bar 隐隐可见直观展示悬浮效果仓库还调用了getSupportActionBar().setSplitBackgroundDrawable(d)将同一份半透明背景同时应用到分屏式splitAction Bar上。这覆盖了横屏或窄屏时系统可能自动拆分的底部操作栏场景保证两种形态下视觉一致。值得注意的是仓库将 drawable 放在了res/drawable/不区分密度目录因为这里是纯色 shape无需针对各密度提供位图资源而菜单图标则按惯例分布在drawable-hdpi、drawable-mdpi、drawable-xhdpi、drawable-xxhdpi等目录中。五、菜单与交互overlay 模式不影响选项栏overlay 只改变 Action Bar 与内容的空间关系不改变它的菜单能力。本示例的菜单定义在 actions.xmlmenu xmlns:androidhttp://schemas.android.com/apk/res/android xmlns:apphttp://schemas.android.com/apk/res-auto item android:idid/add android:icondrawable/ic_action_new app:showAsActionalways android:titlestring/add/ item android:idid/reset android:icondrawable/ic_action_refresh app:showAsActionalways|withText android:titlestring/reset/ item android:idid/about android:icondrawable/ic_action_about app:showAsActionnever android:titlestring/about/ /menu这里使用的是app:showAsAction命名空间http://schemas.android.com/apk/res-auto而非android:showAsAction这是appcompat-v7的标配写法——android:showAsAction属性在旧系统上会被忽略而app:前缀能确保 AppCompat 正确解析add和reset常驻操作栏always/always|withTextabout收入溢出菜单never对应的处理逻辑在 ActionBarDemoActivity.javaadd追加单词、reset重置列表、about弹出 Toast文案见 strings.xml。六、与原生 Action Bar 实现的对比仓库中 ActionBar/OverlayNative 是同一主题的原生版本两相对照可以清晰看到appcompat-v7的桥接差异步骤原生实现OverlayNativeAppCompat 实现OverlayActivity 基类ListActivityAppCompatActivity启用 overlaygetWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY)supportRequestWindowFeature(Window.FEATURE_ACTION_BAR_OVERLAY)获取 Action BargetActionBar()getSupportActionBar()背景设置setBackgroundDrawable(d)setBackgroundDrawable(d)setSplitBackgroundDrawable(d)核心机制相同——都是通过FEATURE_ACTION_BAR_OVERLAY让 Action Bar 不占用窗口布局空间差异在于 AppCompat 用support*API 在低版本设备上复刻原生行为。这正是appcompat-v7的价值让旧系统也能获得与高版本一致、且可编程控制的 Action Bar 体验。七、工程配置让 overlay 示例跑起来该示例的构建配置集中在两处模块级 app/build.gradleapply plugin: com.android.application dependencies { implementation com.android.support:appcompat-v7:27.1.1 } android { compileSdkVersion 27 buildToolsVersion 27.0.3 defaultConfig { minSdkVersion 15 targetSdkVersion 27 } }项目级 build.gradle声明了 Android Gradle 插件 3.1.4并配置google()与jcenter()仓库。另外AndroidManifest.xml 中有两个与 overlay 主题直接相关的声明android:themestyle/Theme.AppCompat应用必须使用 AppCompat 主题族否则AppCompatActivity无法正常工作。事实上appcompat-v7的主题如Theme.AppCompat内部默认就开启了 Action Bar 相关特性运行时 overlay 开关由supportRequestWindowFeature()按需打开minSdkVersion14/targetSdkVersion14仓库中该清单声明的 target 较旧而 Gradle 配置实际以targetSdkVersion 27为准。在真机运行时建议以 build.gradle 的配置为准并在调用setBackgroundDrawable()前后做好 API 兼容判断。仓库使用 Gradle Wrappergradle-wrapper.properties对应 Gradle 4.4克隆后可直接用./gradlew assembleDebug构建出可安装的 APK 进行验证。八、overlay 模式的实战要点与边界结合本示例与 Android 平台行为使用时请留意以下几点内容顶部易被遮挡overlay 模式下setContentView()的内容默认延伸到屏幕顶端Action Bar 会压住其首行。本示例故意不做 padding 补偿以便直观展示悬浮效果实际产品中通常需要为内容顶部预留 Action Bar 高度的内边距如使用actionBarSize或fitSystemWindows来平衡悬浮感与可读性。透明度是悬浮感的灵魂纯不透明的 overlay 会遮挡内容顶部失去意义。可参考本示例用shapesolid android:color#AAFFFFFF//shape这种最轻量的方式制造半透明背景需要渐变、圆角时可在同一 drawable 中继续扩展shape的能力。split 场景别遗漏本示例额外调用setSplitBackgroundDrawable()当系统在横屏/窄屏自动切换为 split Action Bar 时操作栏仍保持同样的半透明观感。方法调用顺序supportRequestWindowFeature()必须在setContentView()之前调用否则特性不会生效。菜单前缀用app:AppCompat 项目中showAsAction务必使用app:命名空间否则旧版本设备上菜单行为可能不符合预期。小结appcompat-v7的 overlay Action Bar 为内容密集型界面提供了一种内容至上的布局方案。通过 AppCompat/Overlay 这个约百行代码的精简示例你可以一次性掌握supportRequestWindowFeature(Window.FEATURE_ACTION_BAR_OVERLAY)的启用时机、半透明背景 drawable 的搭配方式、split 背景的同步处理以及app:前缀菜单在 AppCompat 项目中的正确写法。对照同仓库的 ActionBar/OverlayNative 原生实现还能同时理清 AppCompat 桥接 API 与原生 API 的对应关系为后续做更复杂的自定义 Action Bar 打下基础。赞分享示例工程教程【免费下载链接】cw-omnibusSource code to omnibus edition of _The Busy Coders Guide to Android Development_项目地址https://gitcode.com/gh_mirrors/cw/cw-omnibus点击查看免费下载相关推荐cw-omnibus 实战在 appcompat-v7 中使用 SwitchCompat 实现主题化开关控件cw omnibus 实战在 appcompat v7 中使用 SwitchCompat 实现主题化开关控件 导读本篇文章以 cw omnibus 仓库中示例工程教程cw-omnibus 实战在 appcompat-v7 下使用 RadioButton 与 RadioGroup 构建单选界面cw omnibus 实战在 appcompat v7 下使用 RadioButton 与 RadioGroup 构建单选界面 本篇技术指南以 cw omni示例工程教程cw-omnibus 实战让原生 Action Bar 悬浮覆盖内容——OverlayNative 示例深度解析cw omnibus 实战让原生 Action Bar 悬浮覆盖内容——OverlayNative 示例深度解析 ActionBar/OverlayNativ示例工程教程上一篇MusicFreeDesktop热门插件推荐扩展播放器无限可能下一篇whisper.cpp 模型怎么选一份 5 分钟定档的本地部署选型清单创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

fountain 旧版本项目升级全流程:从 SDK 1.0.x + fountain 1.0.x 迁移到与当前 fboot 同版的实践指南

fountain 旧版本项目升级全流程:从 SDK 1.0.x + fountain 1.0.x 迁移到与当前 fboot 同版的实践指南

后端Web框架 【免费下载链接】fountain 一个用于服务器应用开发的综合工具库。 - 零配置文件 - 环境变量和命令行参数配置 - 约定优于配置 - 深刻利用仓颉语言特性 - 只需要开发动态链接库,fboot负责加载、初始化并运行 - 覆盖服务器应用开发的各种场景 项目地址&am…

2026/10/15 2:08:15 阅读更多 →
信用额度管理体系如何落地:从授信前到授信后的全链路拆解

信用额度管理体系如何落地:从授信前到授信后的全链路拆解

/* 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 2:08:15 阅读更多 →
如何 3 步接入 PokeAPI 多语言数据的 20 种以上语言

如何 3 步接入 PokeAPI 多语言数据的 20 种以上语言

如何 3 步接入 PokeAPI 多语言数据的 20 种以上语言 【免费下载链接】pokeapi The Pokmon API 项目地址: https://gitcode.com/GitHub_Trending/po/pokeapi 🌍 一只宝可梦,多个名字 同一只 Mew,日本用户看到的是日文名,捷…

2026/10/15 2:08:15 阅读更多 →

最新新闻

Natron ErodeSmooth 节点完全指南:归一化功率加权腐蚀/膨胀滤镜的参数解析与源码级解读

Natron ErodeSmooth 节点完全指南:归一化功率加权腐蚀/膨胀滤镜的参数解析与源码级解读

音视频视频处理图形学桌面应用 【免费下载链接】Natron Open-source video compositing software. Node-graph based. Similar in functionalities to Adobe After Effects and Nuke by The Foundry. 项目地址: https://gitcode.com/gh_mirrors/na/Natron 点击查看 …

2026/10/15 3:32:41 阅读更多 →
GreaterWMS 移动端构建实战:基于 Quasar CLI 与 Cordova 的 Android 打包安装全流程

GreaterWMS 移动端构建实战:基于 Quasar CLI 与 Cordova 的 Android 打包安装全流程

后端前端企业应用 【免费下载链接】GreaterWMS This Inventory management system is the currently Ford Asia Pacific after-sales logistics warehousing supply chain process . After I leave Ford , I start this project . You can share your vacant warehouse space, …

2026/10/15 3:32:41 阅读更多 →
从Apollo-11代号项目到可复现工程:逆向拆解与改造指南

从Apollo-11代号项目到可复现工程:逆向拆解与改造指南

/* 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 3:32:41 阅读更多 →
rospack depends1 报错排查:ROS依赖查询与环境变量配置实战

rospack depends1 报错排查:ROS依赖查询与环境变量配置实战

/* 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 3:32:41 阅读更多 →
Vue2多页面应用模板:从vue.config.js到webpack配置的完整实践

Vue2多页面应用模板:从vue.config.js到webpack配置的完整实践

简介:Vue 2.0多页面应用模板面向需要同时维护多个独立页面的前端开发场景,旨在解决传统单页应用在官网、专题页等多入口项目中重复搭建构建流程、难以统一工程化配置的问题。资源包共32个文件,压缩后仅31KB,包含15个JavaScript脚本…

2026/10/15 3:32:41 阅读更多 →
NC65销售订单批量导入实战:从数据清洗到SQL脚本全攻略

NC65销售订单批量导入实战:从数据清洗到SQL脚本全攻略

/* 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 3:31:40 阅读更多 →

日新闻

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/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/14 7:53:34 阅读更多 →