Android 4.4 之前,Android 的状态栏是黑色背景,无法修改
Android 4.4 推出了透明状态栏的效果。
Android 5.0 提供了方法可以直接修改状态栏的颜色。

目录:

  1. 隐藏 ActionBar
  2. 隐藏状态栏
  3. 半透明效果的状态栏(5.0 是半透明,4.4 是渐变)
  4. 透明效果状态栏
    (1) 状态栏与桌面背景颜色相同
    (2)状态栏与 Toolbar 背景颜色相同

1. 隐藏 ActionBar

隐藏 ActionBar 的效果

  • 方法一
    在 AndroidManifest.xml 中定义
<application android:theme="@android:style/Theme.NoTitleBar”>

效果:整个项目的 Activity 都会隐藏 ActionBar

  • 方法二
    在 setContentView() 之调用
requestWindowFeature(Window.FEATURE.NO_TITLE)

这个方法在「第一行代码」中讲到过,但是使用有一个前提:必须继承自 Activity 才有效果

  • 方法三
    在 setContentView() 之调用
getSupportActionBar().hide();

继承自 AppCompatActivity 有效果

  • 方法四
    重写一个 style,在其中添加
<item name=“windowNoTitile”>true</item>

2. 隐藏状态栏

隐藏了状态栏和 ActionBar

  • 方法一
private void hideStatusBar(){View decorView = getWindow().getDocorView()int option = View.SYSTEM_UI_FLAG_FULLSCREEN; decorView.setSystemUiVisibility(option);
}
  • 方法二
    在 setvContentView() 之后
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
  • 方法三
android:theme=“@android:style/Theme.NoTitleBar.Fullscreen”

3. 半透明效果的状态栏

5.0 的半透明效果

4.0 的半透明效果

  • 方法一
<item name=“android.windowTranslucentStatus”>true</item>
  • 方法二
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {                getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}

4. 透明效果状态栏

4.1 状态栏与 Activity 的背景颜色相同

5.0 状态栏与 Activity 的背景颜色相同

if(Build.VERSION.SDK_INT >= 21){getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LAYOUT_STABLE);getWindow().setStatusBarColor(Color.TRANSPARENT)
}

注意

<item name="android:windowTranslucentStatus">false</item>

android:windowTranslucentStatus 设置为 false
不然还是半透明的效果

有些厂商的系统就算设置成半透明效果,还是会直接显示成透明效果


4.2 状态栏与 Toolbar 颜色相同

5.0 状态栏与 Toolbar 颜色相同

Toolbar 的 xml 代码

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbarandroid:id="@+id/mytoolbar"xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:fitsSystemWindows="true"android:clipToPadding="true"android:minHeight="?attr/actionBarSize"android:paddingTop="@dimen/toolbar_padding_top"android:background="@color/colorToolbarBack">
</android.support.v7.widget.Toolbar>

注意:
toolbar_padding_top 在 values-v19 下设置为 25dp,在 values-v21 下设置为 0dp
android:fitSystemWindow=“true” 在 5.0 系统下避免 Toolbar 整体上移到状态栏的位置

在这里补充一下 v19 和 v21的相关知识
v19 指 values-v19,是对应api19+手机型号在此调用。
v21 指 values-v21,是对应api21+手机型号在此调用。
values 对应 values-v19 和 values-v21 中没有对应的属性时默认在此调用。
要创建 values-v19 ,values-v21 需要在切换到 Project 视图下手动创建文件夹,如图:

手动创建 values-v19 ,values-v21 文件夹

这里做是将 Toolbar 都背景延伸到了状态栏,Android 5.0 提供了新的方法,可以直接修改状态栏的颜色
在 v21 的 styles 文件下添加

<item name="android:statusBarColor">#a6ae51</item>

5.0 自定义状态栏颜色

那么 4.4 版本的怎么实现这种效果呢?

很遗憾,4.4 目前只能做到渐变层的效果
但是根据这篇文章提供的方法,可以自定义 4.4 的状态栏颜色,尽量与 5.0 做到效果一致

左 5.0 右 4.4

package com.example.binguner.test;import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.os.Build;
import android.view.View;
import android.view.ViewGroup;public class StatusBarCompat {private static final int INVALID_VAL = -1;private static final int COLOR_DEFAULT = Color.parseColor("#20000000");@TargetApi(Build.VERSION_CODES.LOLLIPOP)public static void compat(Activity activity, int statusColor){if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){if (statusColor != INVALID_VAL){activity.getWindow().setStatusBarColor(statusColor);}return;}if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP){int color = COLOR_DEFAULT;ViewGroup contentView = (ViewGroup) activity.findViewById(android.R.id.content);if (statusColor != INVALID_VAL){color = statusColor;}View statusBarView = new View(activity);ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,getStatusBarHeight(activity));statusBarView.setBackgroundColor(color);contentView.addView(statusBarView, lp);}}public static void compat(Activity activity){compat(activity, INVALID_VAL);}public static int getStatusBarHeight(Context context){int result = 0;int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");if (resourceId > 0){result = context.getResources().getDimensionPixelSize(resourceId);}return result;}
}

使用时,注意

<item name="android:windowTranslucentStatus">true</item>

android:windowTranslucentStatus 设置为 true,
否则自定义的状态栏无法覆盖到顶部
再在 MainActivity 中

StatusBarCompat.compat(this);

或者想自定义状态栏的颜色

StatusBarCompat.compat(this, getResources().getColor(R.color.status_bar_color));

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

随着越来越的的app使用沉浸式状态栏,有必要对沉浸式状态栏学习一下,查看了很多资料,沉浸式状态栏重要的无法三点:1.实现全屏 (Android4.4跟5.0全屏处理方式有别需分开处理 )2.设置全屏之后为了保证自己写的布局不与状态栏重叠,需要在跟xml的跟布局设置android:fitsSystemWindows=”true” 。基于这几点处理方式可能很多,但是为了便于项目中工具类封装,本编实现方式均已代码方式呈现,xml设置方式可以自行查阅相关资料 3.改变状态栏颜色

—1.全屏设置
对于4.4以上系统,因4.4以上系统是可以设置全屏,代码如下:

?

1

2

window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);

对于5.0系统 具体代码

?

1

2

3

4

5

window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS|WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);

window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LAYOUT_STABLE|View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);

 window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);

仅仅做全屏处理,我们会发现不管是在4.4系统上还是在5.0系统上,我们的布局内容会与状态栏内容出现重叠。

下图为4.4系统

下图为8.0系统

为了解决全屏设置重叠状态栏,我们需要在全屏之上预留状态栏的高度以便正常显示状态栏,而处理方式也很简单 activity layout根目录添加下面代码
android:fitsSystemWindows=”true” 而此处我建议用代码设置,因为通常我们项目中会提取BaseActivity基类抽出一些共性,这种方式比在每个xml中设置属性更方便
rootView.setFitsSystemWindows(true) 此处的rootView指的就是activity对应的跟布局;
进行以上处理之后我们会发现现在状态栏跟我们的布局内容不再重叠了,接下来我们就只需要处理状态栏的颜色问题了。具体代码如下

?

1

2

3

4

5

ViewGroup content= (ViewGroup) findViewById(android.R.id.content);

            ViewGroup childView= (ViewGroup) content.getChildAt(0);

            if(childView!=null){

                childView.setFitsSystemWindows(true);

            }

对于4.4系统因为没有改变状态栏颜色的api,我们可以通过添加一个与状态栏等高的View到根布局的父容器中,而根布局的父容器就是一个ID为android.R.id.content的帧布局被装饰的容器中,这样只需要设置View的颜色即可。对于5.0及以上系统,因已提供设置状态栏和导航栏颜色的api,直接设置即可;
对于4.4以上5.0一下系统

?

1

2

3

4

View view=new View(this);

view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,getStatusHeight()));

 view.setBackgroundColor(Color.RED);

 content.addView(view);

对于5.0及以上系统

?

1

window.setStatusBarColor(Color.RED);

获取状态栏高度

?

1

2

3

4

5

6

7

8

private int getStatusHeight() {

int statusHeight=-1;

int resourceId=getResources().getIdentifier("status_bar_height","dimen","android");

       if(resourceId>0){

          return getResources().getDimensionPixelSize(resourceId);

       }

       return 0;

   }

以上就是实现沉浸式状态栏的具体过程。整体代码如下:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

package com.example.administrator.myjavadeamo.activity;

import android.graphics.Color;

import android.os.Build;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.view.View;

import android.view.ViewGroup;

import android.view.Window;

import android.view.WindowManager;

import com.example.administrator.myjavadeamo.R;

public class StatusBarActivity extends AppCompatActivity {

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        supportRequestWindowFeature(Window.FEATURE_NO_TITLE);//隐藏标题栏

        setContentView(R.layout.activity_status_bar);

        initWindow();

    }

    private void initWindow() {

        Window window=getWindow();

        if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP){

            //5.0以上的手机

            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS|WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);

            window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LAYOUT_STABLE|View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);

            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);

            ViewGroup content= (ViewGroup) findViewById(android.R.id.content);

            ViewGroup childView= (ViewGroup) content.getChildAt(0);

            if(childView!=null){

                childView.setFitsSystemWindows(true);

            }

            window.setStatusBarColor(Color.GREEN);

        }else if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.KITKAT){

            //4.4以上5.0一下的手机

            window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

            window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);

            ViewGroup content= (ViewGroup) findViewById(android.R.id.content);

            ViewGroup childView= (ViewGroup) content.getChildAt(0);

            if(childView!=null){

                childView.setFitsSystemWindows(true);

            }

            View view=new View(this);

            view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,getStatusHeight()));

            view.setBackgroundColor(Color.GREEN);

            content.addView(view);

        }

    }

    /**

     * 获取状态栏高度

     * @return

     */

    private int getStatusHeight() {

        int statusHeight=-1;

        int resourceId=getResources().getIdentifier("status_bar_height","dimen","android");

        if(resourceId>0){

           return getResources().getDimensionPixelSize(resourceId);

        }

        return 0;

    }

}

最终实现结果:

4.4系统

8.0系统

Android状态栏相关推荐

  1. Android状态栏颜色修改

    android状态栏颜色修改 状态栏颜色的修改在4.4和5.x环境下分别有不同的方式,低于4.4以下是不能修改的. 5.x环境下 方式一,状态栏将显示为纯净的颜色,没有渐变效果 [java] view ...

  2. android wifi布局,如何实现Android状态栏的Wi-Fi搜索周边的列表和周围Wi-Fi强度图标切换?...

    我想要实现例如Android状态栏以及筛选列表一样:链接之后就显示当前Wi-Fi信号状态图标,扫描之后进行周围链接的信号强度的显示. 第一个问题 实现的结果是都在一行. 在hashmap遍历中,我尝试 ...

  3. Android 应用开发---Android状态栏微技巧

    Android状态栏微技巧,带你真正理解沉浸式模式 其实说到沉浸式状态栏这个名字我也是感到很无奈,真不知道这种叫法是谁先发起的.因为Android官方从来没有给出过沉浸式状态栏这样的命名,只有沉浸式模 ...

  4. android 透明栏,Android状态栏透明(沉浸式效果)

    Android状态栏透明(沉浸式效果) 默认效果 沉浸式效果 方式一 源码 1. 修改状态栏和导航栏的属性为透明 if (Build.VERSION.SDK_INT >= Build.VERSI ...

  5. Android 状态栏样式设置

    通过setStatusBarBgColor方法直接设置颜色即可,状态栏字体颜色会根据背景颜色进行改变.只支持6.0及以上版本. public void setStatusBarBgColor(@Col ...

  6. 实现Android状态栏变色(纯色或者渐变色)

    实现Android状态栏变色(纯色或者渐变色) Android开发中为了保证显示一致性,可能需要调整statusBar的背景色.Android 5.0开始只需要修改styles.xml文件中color ...

  7. Android 状态栏全透明策略

    #Android 状态栏全透明策略 @(Android) 展示效果: Android4.4以下: 状态栏黑乎乎一片 Android4.4以后, 可以将状态栏设置为透明, 或者任意颜色 1. 全屏模式 ...

  8. Android状态栏和导航栏透明和沉浸式模式

    最近在App上需要对状态栏进行相关的设置,在网上看了些文章,像郭神的沉浸式那篇博客对我启发蛮大,但是对状态栏的设置,包括隐藏,透明,颜色设置等,并没有比较系统的概念,实现方式不止一种,有操作Windo ...

  9. android 复制状态栏,Android状态栏

    Android状态栏(Status Bar)颜色 Android在4.4版本推出一个透明状态栏的概念,使手机顶部的状态栏的颜色全透明. 在5.0版本推出了Material Design,可以修改状态栏 ...

  10. android 状态栏隐藏 源码分析,Android 沉寖状态栏与透明状态栏

    Android7.0都已经正式发布了,现在再谈沉寖状态栏或者透明状态栏已经不是什么新鲜玩意了,IOS不用说,它们对于状态栏的支持比Android丰富而且规范的多,Android状态栏可以自定义颜色是从 ...

最新文章

  1. 判断字符串不包含某个字符php,java判断字符串是否包含某个字符的方法
  2. udacity 项目3人脸检测
  3. 【FAQ】使用 LOAD 載入外部中文字檔 *.TXT, 中文字卻成為亂碼之解決
  4. Howto: (Almost) Everything In Active Directory via C#
  5. 关于fmincon和cvx
  6. .net core 集成 autofac.
  7. 动态代理和静态代理的区别_代理,是动态和静态的吗?
  8. 【解决问题】右键添加UltraEdit打开文件
  9. 20套初级javaweb项目开发案例(适合小白)
  10. 仿微信,qq在短时间内接受多条消息只响一声
  11. 关于spyder打不开的问题
  12. Python批量将MP3音频转为WAV格式(附代码) | Python工具
  13. Springboot实现remember-me记住我功能
  14. DELL笔记本UEFI+GPT安装window10与Ubuntu双系统
  15. python学完不会用_如何学习Python的基础知我感觉我学Python的基础知识学了不会运用,就是学完一节课写代码就抓瞎?...
  16. 电脑开机后没反应,如何解决?
  17. java 大数据以及Hadoop相关概念介绍
  18. TP5查询构造器查询语句select、find、colum、value详解
  19. java基础之super关键字_繁星漫天_新浪博客
  20. Matlab/Simulink中PMSM模型的反电动势系数和转矩系数

热门文章

  1. 记录一下CUDA-opencv联合编程
  2. 虚拟服务器目录,服务器虚拟主机目录
  3. 7.1 pdo 宝塔面板php_小白入门基础傻瓜式操作PHP面板安装使用_Bt宝塔面板
  4. python参数化_Python unittest 简单实现参数化的方法
  5. oracle 截取字符串中指定位置_手撕虚拟内存(1)——字符串在虚拟内存中的段位置与/proc虚拟文件系统...
  6. 11.32 php扩展模块装安
  7. 使用for循环遍历文件
  8. 常用小功能(打电话、发短信、发邮件)
  9. Linux Netcat 命令——网络工具中的瑞士×××
  10. 低阶 TensorFlow 基础知识