关于沉浸式状态栏,给大家推荐一个非常好的博文android标题栏、状态栏图标文字颜色及背景动态变化

另外说明下,沉浸式状态栏的实现仅适用于 android 4.4及以上版本,4.4以下的就不要想了。

1. 实现秀明状态栏常规方法

    //是否使用特殊的标题栏背景颜色,android5.0以上可以设置状态栏背景色,如果不使用则使用透明色值protected boolean useThemestatusBarColor = false;//是否使用状态栏文字和图标为暗色,如果状态栏采用了白色系,则需要使状态栏和图标为暗色,android6.0以上可以设置protected boolean useStatusBarColor = true;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);setStatusBar();}protected void setStatusBar() {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//5.0及以上View decorView = getWindow().getDecorView();int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN| View.SYSTEM_UI_FLAG_LAYOUT_STABLE;decorView.setSystemUiVisibility(option);//根据上面设置是否对状态栏单独设置颜色if (useThemestatusBarColor) {getWindow().setStatusBarColor(getResources().getColor(R.color.colorTheme));//设置状态栏背景色} else {getWindow().setStatusBarColor(Color.TRANSPARENT);//透明}} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {//4.4到5.0WindowManager.LayoutParams localLayoutParams = getWindow().getAttributes();localLayoutParams.flags = (WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | localLayoutParams.flags);} else {Toast.makeText(this, "低于4.4的android系统版本不存在沉浸式状态栏", Toast.LENGTH_SHORT).show();}if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && useStatusBarColor) {//android6.0以后可以对状态栏文字颜色和图标进行修改getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);}}

在Activity布局的根节点处加上 android:fitsSystemWindows=”true” 属性就可以了,要不布局会跑到状态栏和导航栏下面,与导航栏和状态栏重叠,这当然不是我们希望的。
 
效果图如下:

此时,
useThemestatusBarColor = false,说明不设置状态栏背景色,为透明
useStatusBarColor = true,使状态栏图标和文字变暗,这个很有必要,不设置为true的话,由于状态栏字体颜色为白色,和状态栏背景色重叠,分不清。

上面设置状态栏文字颜色和图标为暗色主要采用了以下两个标志:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && useStatusBarColor) {//android6.0以后可以对状态栏文字颜色和图标进行修改getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);}

2. 同一个Activity包含多个Fragment时,如何实现不同fragment的状态栏背景和文字颜色不一样
实现以下效果
(1).当标题栏背景为图片时,此时需要背景图片填充到状态栏的效果,如左图
(2).当标题栏背景不是图片,此时不需要背景图片填充状态栏的效果,如右图
暂时不考虑标题栏中既有背景图,又有背景色的情况,当然也可以实现,将左图中的标题栏的高度设置高一点即可(右图中的状态栏背景既有图片又有背景色仅仅是为了显示区分)
 

就是设置了状态栏为暗色后,还得设置回来,这其实主要靠下面两个flag标识,结全上面的两个flag标识就能实现。

//设置状态栏文字颜色及图标为浅色
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
  • View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
    前面说过了,是为了让视图能延伸到状态栏区域,使状态栏悬浮在视图布局之上。

  • View.SYSTEM_UI_FLAG_LAYOUT_STABLE
    保持整个View稳定, 常和控制System UI悬浮, 隐藏的Flags共用, 使View不会因为System UI的变化而重新layout。

贴出MainActivity中的代码:

public class MainActivity extends AppCompatActivity implements RadioGroup.OnCheckedChangeListener,ViewPager.OnPageChangeListener {private static final String TAG = "MainActivity";public static final int PAGE_ONE = 0;public static final int PAGE_TWO = 1;public static final int PAGE_THREE = 2;public static final int PAGE_FOUR = 3;private RadioGroup rgTabBar;private RadioButton rbChannel;private RadioButton rbMessage;private RadioButton rbBetter;private RadioButton rbSetting;private ViewPager viewpager;private MyFragmentPagerAdapter mAdapter;//是否使用特殊的标题栏背景颜色,android5.0以上可以设置状态栏背景色,如果不使用则使用透明色值protected boolean useThemestatusBarColor = true;//是否使用状态栏文字和图标为暗色,如果状态栏采用了白色系,则需要使状态栏和图标为暗色,android6.0以上可以设置protected boolean useStatusBarColor = true;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager());initViews();}private void initViews() {rgTabBar = findViewById(R.id.rg_tab_bar);rbChannel = findViewById(R.id.rb_channel);rbMessage = findViewById(R.id.rb_message);rbBetter = findViewById(R.id.rb_better);rbSetting = findViewById(R.id.rb_setting);viewpager = findViewById(R.id.viewpager);rgTabBar.setOnCheckedChangeListener(this);viewpager.setAdapter(mAdapter);viewpager.setCurrentItem(0);viewpager.addOnPageChangeListener(this);rbChannel.setChecked(true);}@Overridepublic void onCheckedChanged(RadioGroup group, int checkedId) {switch (checkedId) {case R.id.rb_channel:viewpager.setCurrentItem(PAGE_ONE);setStatusBar(R.color.colorWhite);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//build.gradle中compileSdkVersion>=23//    实现状态栏图标和文字颜色为暗色getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);}break;case R.id.rb_message:viewpager.setCurrentItem(PAGE_TWO);setStatusBar(R.color.colorRed);getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);break;case R.id.rb_better:setStatusBar(R.color.colorGreen);getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);break;case R.id.rb_setting:viewpager.setCurrentItem(PAGE_FOUR);setStatusBar(R.color.colorBlue);getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);break;}}@Overridepublic void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}@Overridepublic void onPageSelected(int position) {}@Overridepublic void onPageScrollStateChanged(int state) {if (state == ViewPager.SCROLL_STATE_SETTING) {int currentItemPosition = viewpager.getCurrentItem();Log.w(TAG, "onPageScrollStateChanged: currentItemPosition::" + currentItemPosition);switch (currentItemPosition) {case PAGE_ONE:rbChannel.setChecked(true);break;case PAGE_TWO:rbMessage.setChecked(true);break;case PAGE_THREE:rbBetter.setChecked(true);break;case PAGE_FOUR:rbSetting.setChecked(true);break;}}}//******************************************************************************************protected void setStatusBar(int colorId) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//5.0及以上View decorView = getWindow().getDecorView();int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN| View.SYSTEM_UI_FLAG_LAYOUT_STABLE;decorView.setSystemUiVisibility(option);//根据上面设置是否对状态栏单独设置颜色if (useThemestatusBarColor) {getWindow().setStatusBarColor(getResources().getColor(colorId));//设置状态栏背景色} else {getWindow().setStatusBarColor(Color.TRANSPARENT);//透明}} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {//4.4到5.0WindowManager.LayoutParams localLayoutParams = getWindow().getAttributes();localLayoutParams.flags = (WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | localLayoutParams.flags);} else {Toast.makeText(this, "低于4.4的android系统版本不存在沉浸式状态栏", Toast.LENGTH_SHORT).show();}if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && useStatusBarColor) {//android6.0以后可以对状态栏文字颜色和图标进行修改getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);}}}

另外特别强调下

上述代码暂时不适用于底部带有导航栏的手机,如果对上述代码不做处理的话那么,带有底部导航栏手机底部导航按钮会和navigationbar重叠。
如过你的手机底部带有导航栏的话,还是强烈推荐你看那篇非常好的博文android标题栏、状态栏图标文字颜色及背景动态变化
好了,上述内容就是我记录的对于“沉浸式状态栏”的认识,也是为了加深理解和掌握其用法。对于不含底部带有导航栏的手机上述代码足够实现常用的沉浸式效果了。

后续待我会继续参照大牛的博客,完善此篇文章。小伙伴如果有疑问的话,请留言,我们共同学习!!!

Android实现沉浸式状态栏效果相关推荐

  1. android 工具栏沉浸 下拉,如何在Android应用中实现一个沉浸式状态栏效果

    如何在Android应用中实现一个沉浸式状态栏效果 发布时间:2020-12-08 17:04:42 来源:亿速云 阅读:151 作者:Leah 这篇文章将为大家详细讲解有关如何在Android应用中 ...

  2. Android各种沉浸式状态栏实现

    1.引入 dependencies {compile 'com.gyf.barlibrary:barlibrary:2.3.0' } 2.使用:在BaseActivity 中初始化 public ab ...

  3. Android实现沉浸式状态栏(透明状态栏)(QQ和简书样式)

    本文内容大多参考网络上的Android实现沉浸式状态栏教程,由于看了太多类似文章,固在此不再一一列举出处.本文仅为我自己梳理思路和供各位看到本文的朋友参考(百度:Android沉浸式状态栏,第一页内容 ...

  4. android沉浸式状态栏 图片背景,Android App 沉浸式状态栏解决方案

    伴随着 Android 5.0 发布的 Material Design,让 Android 应用告别了以前的工程师审美,迎来了全新的界面,灵动的交互,也让越来越多的 App 开始遵从 material ...

  5. Android一键沉浸式状态栏(透明状态栏)

    文章适合新手了解Android一键沉浸式状态栏.文章在编写过程中难免有疏漏和错误,欢迎大佬指出文章的不足之处:更多内容请点进

  6. Android 笔记 沉浸式状态栏设置及效果说明

    使用android原生的方法设置setSystemUiVisibility,以下是设置相应的属性和展示效果,以及适合场景: ## 沉浸式状态栏 基于anroid5.0开发适配if (Build.VER ...

  7. Android 之 沉浸式状态栏及顶部状态栏背景色设置

    现在很多应用都引用了沉浸式状态栏,如QQ,效果下图: 效果很酷炫,其实设置也很简单.但是,需要注意的是,这种效果只能在API19以及以上版本中才能够做到. 方法一: 首先,如果想让界面Activity ...

  8. Android的沉浸式状态栏与变色状态栏详解

    此文章装载至http://www.androidchina.net/3520.html点击打开链接 一. 首先我们得了解什么是透明状态栏以及什么是沉浸式状态栏,以及其区别,国内习惯称透明状态栏为沉浸式 ...

  9. Android Compose 沉浸式状态栏

    官方文档 Guide - Accompanist 已经废弃了 但是要使用 WindowCompat.setDecorFitsSystemWindows(window, false) 所以我们使用这个库 ...

最新文章

  1. 使用 CodeIgniter 框架快速开发 PHP 应用(二)
  2. linux创建的kvm无法运行,使用virt-manager运行虚拟机的方法(创建第一个虚拟机)...
  3. 计算机网络第一章:计算机网络概述
  4. ie-css3.htc参数无效,ie-css3.htc怎么用?
  5. 【转】使 用免费UMS架设Flash流媒体服务
  6. linux raid卷,linux – Areca RAID卷和LVM对齐
  7. 2014年4月的北京大学微电子考研复试题-什么是小信号?
  8. 牛顿法, Jacobian矩阵 和 Hessian矩阵
  9. awk正则匹配nginx日志【原创】
  10. Docker修改容器系统时间命令组
  11. linux如果时间等于22点,Linux下ntpdate时间同步
  12. VMware vSphere常见问题汇总(十九)
  13. c++ 一维高斯拟合_χ2检验教案:拟合度检验与正态分布的关系
  14. Android开发的第一天
  15. iperf工具源码下载、编译、以及测试网络带宽
  16. 使用微信即时远程开门
  17. Qt中其他类调用窗口中的ui控件
  18. 7个经典小故事给在职场困倦的你打打气
  19. Ubuntu Women:女娃玩电脑不输纯爷们!
  20. 题目1:输入两个整数A和B,输出它们的和。

热门文章

  1. C语言中PURGE用法,使用Purge_dups去冗余序列
  2. 遍历二叉树,一篇博客就够了
  3. Vector多维向量定义
  4. 计算机主板电池没电什么情况,主板电池没电了会出现什么情况
  5. html file onchange事件,input type=file 的onchange事件
  6. Linux系统编程入门(一)
  7. 无连接应用程序丢包率测试/UDP丢包率测试【基于数据报套接字的网络程序设计】
  8. 个人签名【优秀赏析】
  9. 今天你花里胡哨了吗 --- 定制属于自己的linux ssh迎宾信息
  10. linux 查看crond服务器,CentOS安装crond服务