沉浸式状态栏工具类

沉浸式状态栏的实现原理很简单,就是将状态栏隐藏掉,然后在原来状态栏的位置添加一个和状态栏大小一模一样的View,这个View的颜色定义成和Toolbar一样的颜色就行了

在styles.xml文件中设置主题样式为NoActionBar

    <!-- Base application theme. --><style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"><!-- Customize your theme here. --><item name="colorPrimary">@color/colorPrimary</item><item name="colorPrimaryDark">@color/colorPrimaryDark</item><item name="colorAccent">@color/colorAccent</item></style>

这样系统自带的ActionBar就没有了,需要自己在布局文件中添加Toolbar

透明化状态栏

/*** 沉浸式状态栏工具类*/
public class StatusBarUtils {/*** 透明化状态栏*/public static void transparentStatusBar(Activity act, boolean fitWindow) {Window window = act.getWindow();//透明状态栏window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//获取根布局ViewGroup root = (ViewGroup) act.findViewById(android.R.id.content);View firstChild = root.getChildAt(0);if (firstChild != null) {//设置root的第一个子View,使其为系统View预留空间.firstChild.setFitsSystemWindows(fitWindow);}}}
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

这行代码的作用就是使状态栏透明化

        //获取根布局ViewGroup root = (ViewGroup) act.findViewById(android.R.id.content);View firstChild = root.getChildAt(0);if (firstChild != null) {//设置root的第一个子View,使其为系统View预留空间.firstChild.setFitsSystemWindows(fitWindow);}

这一串代码的作用是就是在布局文件的最外层控件上添加了一个android:fitsSystemWindows="true"属性,当然也可以在布局文件中添加,就像下面这样

<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"android:fitsSystemWindows="true"android:orientation="vertical"><android.support.v7.widget.Toolbarandroid:id="@+id/toolbar"android:layout_width="match_parent"android:layout_height="?attr/actionBarSize"android:background="@color/blue"app:title="标题"/></LinearLayout>

android:fitsSystemWindows="true"的效果是为系统View预留空间,也就是将状态栏的位置空出来,它的默认值是false。下图是对比这个属性在状态栏透明时设置为true和false的区别

设置为true的效果

设置为false的效果

创建状态栏

public static View createStatusBar(Context context, int color) {//方法原理://添加一个和状态栏高、宽相同的指定颜色的View来覆盖被透明化的状态栏View statusBar = new View(context);LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(context));statusBar.setLayoutParams(params);statusBar.setBackgroundColor(color);return statusBar;}

这部分没什么好讲的,就是单纯的创建一个状态栏,状态栏的颜色通过参数设置

public static int getStatusBarHeight(Context context) {int statusBarHeight = -1;try {Class clazz = Class.forName("com.android.internal.R$dimen");//通过反射获取状态栏高度这个成员变量Field status_bar_height = clazz.getField("status_bar_height");Object obj = clazz.newInstance();int height = Integer.parseInt(status_bar_height.get(obj).toString());statusBarHeight = context.getResources().getDimensionPixelSize(height);} catch (Exception e) {e.printStackTrace();}return statusBarHeight;}

这个方法用于获取状态栏的高度,不用在意方法的实现细节,只需要知道这个方法能够获取到状态栏的高度就行了

将创建的状态栏添加到布局上

    public static void addStatusBar(Activity act, int color) {int resource = act.getResources().getColor(color);//创建状态栏View statusBar = createStatusBar(act, resource);//获取根布局ViewGroup root = (ViewGroup) act.findViewById(android.R.id.content);//将状态栏添加到根布局的第一个子布局位置root.addView(statusBar, 0);}

这个方法的第二个参数是传入颜色的id,例如R.color.colorPrimary这样的参数。
这个方法的作用是将状态栏添加到布局上去,什么意思?画个图解释

布局

root.addView(statusBar, 0);这行代码就是将状态栏添加到根布局下面,参数0代表位置
需要注意的是根布局不是指布局文件中最外层的控件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"android:fitsSystemWindows="true"android:orientation="vertical"><android.support.v7.widget.Toolbarandroid:id="@+id/toolbar"android:layout_width="match_parent"android:layout_height="?attr/actionBarSize"android:background="@color/blue"app:title="标题"/></LinearLayout>

我的布局文件是这样的,根布局并不是指LinearLayout

最后一步

    /*** 绘制状态栏* @param act* @param color*/public static void drawableStatusBar(Activity act, int color) {transparentStatusBar(act, true);addStatusBar(act, color);}

添加上这个方法工具类就完成了,下面是完整的代码

/*** 沉浸式状态栏工具类*/
public class StatusBarUtils {/*** 绘制状态栏* @param act* @param color*/public static void drawableStatusBar(Activity act, int color) {transparentStatusBar(act, true);addStatusBar(act, color);}/*** 透明化状态栏** @param act*/public static void transparentStatusBar(Activity act, boolean fitWindow) {Window window = act.getWindow();//透明状态栏window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//透明导航栏window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);//获取根布局ViewGroup root = (ViewGroup) act.findViewById(android.R.id.content);View firstChild = root.getChildAt(0);if (firstChild != null) {//设置 root 的第一个子 View . 使其为系统 View 预留空间.firstChild.setFitsSystemWindows(fitWindow);}}/*** 添加状态栏** @param act* @param color*/public static void addStatusBar(Activity act, int color) {int resource = act.getResources().getColor(color);//创建状态栏View statusBar = createStatusBar(act, resource);//获取根布局ViewGroup root = (ViewGroup) act.findViewById(android.R.id.content);//将状态栏添加到根布局下的第一个子布局位置root.addView(statusBar, 0);}/*** 创建一个状态栏** @param context* @param color* @return*/public static View createStatusBar(Context context, int color) {//方法原理://添加一个和状态栏高、宽相同的指定颜色的View来覆盖被透明化的状态栏View statusBar = new View(context);LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(context));statusBar.setLayoutParams(params);statusBar.setBackgroundColor(color);return statusBar;}/*** 获取状态栏高度** @param context* @return*/public static int getStatusBarHeight(Context context) {int statusBarHeight = -1;try {Class clazz = Class.forName("com.android.internal.R$dimen");//通过反射获取状态栏高度这个成员变量Field status_bar_height = clazz.getField("status_bar_height");Object obj = clazz.newInstance();int height = Integer.parseInt(status_bar_height.get(obj).toString());statusBarHeight = context.getResources().getDimensionPixelSize(height);} catch (Exception e) {e.printStackTrace();}return statusBarHeight;}}

onCreate()方法中调用

    @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);StatusBarUtils.drawableStatusBar(this, R.color.colorPrimary);}

效果如下

Android 系统(227)---沉浸式状态栏工具类相关推荐

  1. Android沉浸式状态栏工具类,一句代码轻松搞定

    Android沉浸式状态栏工具类,一句代码轻松搞定 博客原文及源码地址:http://jaeger.itscoder.com/android/2016/03/27/statusbar-util.htm ...

  2. 安卓沉浸式状态栏,android沉浸式状态栏工具类封装

    文章目录 前言 二.使用步骤 1.定义 2.使用 3.效果 前言 沉浸式状态栏对安卓6.0以上版本很简单,今天分享一个封装好的工具,供大家参考 二.使用步骤 1.定义 代码如下: package co ...

  3. android开发:沉浸式状态栏和全屏模式下输入框和软键盘冲突解决方案

    最近在做一个聊天界面 ,为了让界面好看点就把界面设成了沉浸式状态栏,然后发现沉浸式状态栏下点击输入框软键盘会把输入框给遮住,打字的时候根本不知道自己打了什么,用户体验很差. 百度了一下说在Androi ...

  4. Android 4.4沉浸式状态栏的实现

    要实现Android 4.4上面的沉浸式状态栏要用到开源项目SystemBarTint(https://github.com/hexiaochun/SystemBarTint) public clas ...

  5. android沉浸式状态栏 图片背景,Android 补充 LayerDrawable 沉浸式状态栏

    小菜前些日子整理了两次小小的沉浸式状态栏的总结:Android 沉浸式状态栏的多种样式 和 Android 沉浸式状态栏以及伪沉浸式状态栏.今天小菜再稍稍补充一点,Java/Kotlin 代码中设置 ...

  6. Android沉浸式状态栏(透明系统状态栏)

    Android沉浸式状态栏(透明系统状态栏)的目的:顶部系统状态栏和App的导航栏一体化,不给用户突兀的感觉,使用户把更多的视角留在我们的App上. 沉浸式状态栏的兼容情况 Android版本 透明状 ...

  7. Android 超级简单的沉浸式状态栏

    1.两个工具类和一个xml就完成了 直接复制即可 package com.example.tongliaodemo.activity;import android.app.Activity; impo ...

  8. Android 沉浸式状态栏必须要知道的那些事

    Android 的沉浸式状态栏 文章目录 Android 的沉浸式状态栏 前言 一. 什么是沉浸式状态栏? 二.沉浸式状态栏的实现阶段 2.1.Android4.4 - Android 5.0 (AP ...

  9. android开发沉浸式标题栏_android实现沉浸式状态栏

    前言 在android开发的过程中,经常会涉及到沉浸式状态栏的问题,说白了,就是手机屏幕顶部栏的颜色显示问题,为了实现美感一体的效果,许多app都已经开始了沉浸式状态栏的显示,这里,我也简单介绍一个沉 ...

最新文章

  1. 什么是负边沿触发_晶闸管的导通条件是什么 晶闸管(可控硅)检测方法
  2. __name__ == '__main__'的作用
  3. 关于实验中的makefile相关知识
  4. js字符串函数 [http://www.cnblogs.com/qfb620/archive/2011/07/28/2119799.html]
  5. golang 中的sort 包
  6. asp:UpdatePanel中使用下拉时不得不注意的问题
  7. SAP CRM OData模型里的addressable为true的含义
  8. UFLDL教程:Exercise:Convolution and Pooling
  9. TCP是如何保证包的顺序传输
  10. redis 三种特殊数据类型
  11. Action的mapping.findFoward(forwardName)必须要在struts-config.xml中的对应的action节点配置一个forward节点...
  12. PHP SESSION
  13. 程序员是否要考PMP认证?看这篇就够了
  14. win7修复计算机卡了,Win7修复漏洞补丁后系统变卡的原因和解决方法
  15. unity如何实现图片透视_FPS透视自瞄从入门到入狱
  16. ASP.NET 安全认证(二)【转】
  17. 大学数据库创建与查询实战——查询
  18. 解决东方财富数据接口激活后仍显示reactive的问题
  19. [300iq Contest 1]简要题解
  20. 透过结构看思考与表达

热门文章

  1. 【声传播】——多层介质平面波的反射问题
  2. Linux shell 脚本实例
  3. Linux netfilter源码分析(7)
  4. ubuntu10.04下 简单配置samba
  5. linux server 5.5下载地址,《红帽Linux 5.5 for x86 服务器版》(RedHat Enterprise Linux Server 5.5 for x86)...
  6. mysql space id_MySQL8.0新特性:增加系统文件追踪space ID和物理文件的映射-阿里云开发者社区...
  7. Java面试之阻塞队列
  8. 如何删除Smartphone手机与Office同步后的重复项,如联系人、日程等。Keyword:office,Outlook,删除,重复项目...
  9. React Native Android原生模块开发实战|教程|心得|怎样创建React Native Android原生模块...
  10. Molile App(HTTP/HTML)—Record and Analyze Traffic