分别用ToolBar和自定义导航栏实现沉浸式状态栏
发布时间 - 2026-01-10 22:28:57 点击率:次一、ToolBar

1、在build.gradle中添加依赖,例如:
compile 'com.android.support:appcompat-v7:23.4.0'
2、去掉应用的ActionBar。可以是修改主题theme为“NoActionBar”,例如:
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
或者不修改主题为"NoActionBar",而在主题的style下,添加:
<item name="windowNoTitle">true</item> <item name="windowActionBar">false</item>
第二个属性代表是否用ActionBar代替TitleBar。
其实,刚学的时候,感觉很纳闷,怎么又多了个TitleBar?后来查了很久才发现,3.0以前,状态栏下面的是标题栏(只能显示标题等少量信息),3.0以后就变成了应用栏,也就是ActionBar。
另外,我测试的时候,activity是继承于AppCompatActivity,主题是AppCompat类型的。这种情况下,必须要像上面那样写才有效果,少写或值不同的话,要么没效果,要么报错。
最后,上面两个属性的说明可在android.R.attr这个类中查看。
3、在xml中为ToolBar添加属性
android:fitsSystemWindows="true" android:minHeight="?attr/actionBarSize"
fitsSystemWindows是ToolBar实现沉浸式状态栏的关键,其大概情况是,如果设为true,就会调整这个view去留一些空间给系统窗口,如果不设置或设为false,ToolBar就会和状态栏重叠在一起。
而第二个属性中,它的值全写是"?android:attr/actionBarSize",其意思是引用当前主题中的actionBarSize这个属性。更多相关说明可查看官方文档中Accessing Resources的部分。
上面两个属性可在android.view.View这个类中查看。
4、在java中添加判断sdk版本的代码并在用户的系统是4.4及以上时设置状态栏为透明
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
无论是ToolBar,还是自定义导航栏,这个操作都是实现沉浸式状态栏的关键。
因为设置状态栏为透明的这个属性,要4.4以上才能使用,所以4.4以下的系统是不能够实现沉浸式状态栏的。而在4.4到5.0的系统中,状态栏是全透明的,也就是它的颜色会跟你的ToolBar和自定义导航栏的颜色一样。而在5.0以上的系统中,则是半透明的,也就看起来会比较深暗。
而我在6.0的系统上测试时,发现这一步没设置和设置了的,从效果上看,区别就是没设置时状态栏颜色浅一点,而且ToolBar的padding top为0,而设置了的颜色就深一点,padding top为状态栏的高度。具体有什么影响,还不清楚。但这会让自定义导航的外观变形,它会增加状态栏的高度,但又没有让这部分与状态栏重叠,就导致效果变形。
5、最后在java中添加
setSupportActionBar(mToolbar);
ToolBar的布局代码:
<?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/tool_bar" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/colorPrimary" android:elevation="4dp" android:fitsSystemWindows="true" android:minHeight="?android:attr/actionBarSize" app:title="ToolBar" app:subtitle="toolbar"/>
效果图(Android 6.0):
二、自定义导航栏TopBar
1、设置窗口为无标题,上面第2步中的两个方法都可以实现,或者是在java中添加如下代码:
requestWindowFeature(Window.FEATURE_NO_TITLE);
注意在添加这句代码时,确保是在加载布局内容之前,也就是onCreate的setContentView之前。在《Android群英传》“Android控件架构”,这一节中解释了为什么requestWindowFeature()需要在setContentView()之前。
另外,我发现如果该activity是继承AppCompatActivity的话,只写上面的这句代码是没有变化的,显示的还是ActionBar。但如果是继承FragmentActivity的话,就有效果,也就说上面第2步中的第二个方法,只添加其中任意一个属性都是可以的。至于是什么原因,我还没弄清楚。
2、同上面第4步,判断系统版本并按需设置状态栏为透明
3、获取状态栏的高度
protected int getStatusHeight() {
try {
Class<?> c = Class.forName("com.android.internal.R$dimen"); // 获得与字符串对应的Class对象
Object object = c.newInstance(); // 创建这个Class的实例对象
Field field = c.getField("status_bar_height"); // 拿到字符串对应的变量
int x = Integer.parseInt(field.get(object).toString()); // 通过这个实例对象拿到这个变量的值,再转换类型,最后转为整型,变为一个资源id
return getResources().getDimensionPixelSize(x);
} catch (Exception e) {
e.printStackTrace();
}
return 0;
}
这部分代码是利用Java的反射机制来实现的,因为这个internal包默认会被sdk/platforms/android-version中的android.jar给移除掉,所以无法直接调用或查看这个包中的类。如果要使用的话,可以借助这个开源项目https://github.com/anggrayudi/android-hidden-api。
4、获取自定义TopBar的高度并修改布局参数
protected void setStatusBar() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
final ViewGroup viewGroup = (ViewGroup) findViewById(R.id.top_bar);
final int statusHeight = getStatusHeight();
viewGroup.post(new Runnable() {
@Override
public void run() {
int topBarHeight = viewGroup.getHeight();
LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) viewGroup.getLayoutParams();
layoutParams.height = statusHeight + topBarHeight;
viewGroup.setLayoutParams(layoutParams);
}
});
}
}
因为在include这个TopBar的布局文件中,其父布局是LinearLayout,而TopBar的父布局是RelativeLayout,所以这里先要转成ViewGroup,等getLayoutParams时,再转成LinearLayout.LayoutParams。
TopBar的布局:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/top_bar" android:layout_width="match_parent" android:layout_height="49dp" android:background="@color/colorPrimary" android:gravity="bottom"> <RelativeLayout android:layout_width="match_parent" android:layout_height="49dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="@string/app_name" android:textSize="24sp" android:textColor="#ffffff"/> </RelativeLayout> </RelativeLayout>
因为这个布局的高度会在代码中动态地修改,即49dp加上状态栏的高度,所以只有一个层级的结构的话,那导航栏的内容就会往上偏。所以要嵌套多一层来维持导航栏的高度,同时在最外层的布局中,添加android:gravity="bottom"这个属性来保证导航栏不往上偏。
效果图(Android 6.0):
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
# 沉浸式状态栏
# toolbar沉浸式
# 微软IE Developer Toolbar安装使用简要图文说明
# jquery toolbar与网页浮动工具条具体实现代码
# Java Swing中的工具栏(JToolBar)和分割面版(JSplitPane)组件使用案例
# Toolbar制作菜单条过程详解
# iOS应用中使用Toolbar工具栏方式切换视图的方法详解
# iOS中的导航栏UINavigationBar与工具栏UIToolBar要点解析
# Android5.0+ CollapsingToolbarLayout使用详解
# Android自定义ActionProvider ToolBar实现Menu小红点
# Android自定义Toolbar使用方法详解
# 深入理解Android 5.0中的Toolbar
# 状态栏
# 自定义
# 就会
# 而在
# 第二个
# 都是
# 是在
# 也就
# 设为
# 这部
# 可在
# 往上
# 这句
# 转成
# 类中
# 的是
# 有什么
# 我在
# 就有
# 则是
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何使用Service Container和依赖注入?(代码示例)
Python进程池调度策略_任务分发说明【指导】
如何在IIS中新建站点并解决端口绑定冲突?
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
Claude怎样写约束型提示词_Claude约束提示词写法【教程】
大型企业网站制作流程,做网站需要注册公司吗?
标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?
Laravel如何优化应用性能?(缓存和优化命令)
html如何与html链接_实现多个HTML页面互相链接【互相】
Laravel事件监听器怎么写_Laravel Event和Listener使用教程
javascript如何操作浏览器历史记录_怎样实现无刷新导航
如何在宝塔面板中创建新站点?
如何在企业微信快速生成手机电脑官网?
Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中
如何用免费手机建站系统零基础打造专业网站?
如何正确选择百度移动适配建站域名?
Windows Hello人脸识别突然无法使用
5种Android数据存储方式汇总
Laravel如何升级到最新版本?(升级指南和步骤)
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
Python并发异常传播_错误处理解析【教程】
logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?
Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法
香港服务器如何优化才能显著提升网站加载速度?
如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】
如何在Tomcat中配置并部署网站项目?
bootstrap日历插件datetimepicker使用方法
Laravel如何实现一对一模型关联?(Eloquent示例)
公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?
如何在景安云服务器上绑定域名并配置虚拟主机?
独立制作一个网站多少钱,建立网站需要花多少钱?
Python结构化数据采集_字段抽取解析【教程】
魔毅自助建站系统:模板定制与SEO优化一键生成指南
网站制作大概多少钱一个,做一个平台网站大概多少钱?
Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制
活动邀请函制作网站有哪些,活动邀请函文案?
再谈Python中的字符串与字符编码(推荐)
如何获取PHP WAP自助建站系统源码?
如何在IIS7上新建站点并设置安全权限?
详解jQuery停止动画——stop()方法的使用
怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?
Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用
UC浏览器如何设置启动页 UC浏览器启动页设置方法
如何用好域名打造高点击率的自主建站?
Laravel如何实现本地化和多语言支持?(i18n教程)
Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询
如何用西部建站助手快速创建专业网站?
Python图片处理进阶教程_Pillow滤镜与图像增强
Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布
Java解压缩zip - 解压缩多个文件或文件夹实例

